目标

在本章中,我们将学习直方图反投影。

理论

这是由Michael J. SwainDana H. Ballard在他们的论文《通过颜色直方图索引》中提出的。

用简单的话说是什么意思?它用于图像分割或在图像中查找感兴趣的对象。简而言之,它创建的图像大小与输入图像相同(但只有一个通道),其中每个像素对应于该像素属于我们物体的概率。用更简单的话来说,与其余部分相比,输出图像将在可能有对象的区域具有更多的白色值。好吧,这是一个直观的解释。(我无法使其更简单)。直方图反投影与camshift算法等配合使用。

我们该怎么做呢?我们创建一个图像的直方图,其中包含我们感兴趣的对象(在我们的示例中是背景,离开播放器等)。对象应尽可能填充图像以获得更好的效果。而且颜色直方图比灰度直方图更可取,因为对象的颜色对比灰度强度是定义对象的好方法。然后,我们将该直方图“反投影”到需要找到对象的测试图像上,换句话说,我们计算出属于背景的每个像素的概率并将其显示出来。在适当的阈值下产生的输出使我们仅获得背景。

Numpy中的算法

  1. 首先,我们需要计算我们要查找的对象(使其为“ M”)和要搜索的图像(使其为“ I”)的颜色直方图。
import numpy as np
import cv2 as cvfrom matplotlib import pyplot as plt
#roi是我们需要找到的对象或对象区域
roi = cv.imread('rose_red.png')
hsv = cv.cvtColor(roi,cv.COLOR_BGR2HSV)
#目标是我们搜索的图像
target = cv.imread('rose.png')
hsvt = cv.cvtColor(target,cv.COLOR_BGR2HSV)
# 使用calcHist查找直方图。也可以使用np.histogram2d完成
M = cv.calcHist([hsv],[0, 1], None, [180, 256], [0, 180, 0, 256] )
I = cv.calcHist([hsvt],[0, 1], None, [180, 256], [0, 180, 0, 256] )
  1. 求出比值R=MIR = \frac{M}{I}R=IM​。然后反向投影R,即使用R作为调色板,并以每个像素作为其对应的目标概率创建一个新图像。即B(x,y) = R[h(x,y),s(x,y)] 其中h是色调,s是像素在(x,y)的饱和度。之后,应用条件B(x,y)=min[B(x,y),1]B(x,y) = min[B(x,y), 1]B(x,y)=min[B(x,y),1]。
h,s,v = cv.split(hsvt)
B = R[h.ravel(),s.ravel()]
B = np.minimum(B,1)
B = B.reshape(hsvt.shape[:2])
  1. 现在对圆盘应用卷积,B=D∗BB = D \ast BB=D∗B,其中D是圆盘内核。
disc = cv.getStructuringElement(cv.MORPH_ELLIPSE,(5,5))
cv.filter2D(B,-1,disc,B)
B = np.uint8(B)
cv.normalize(B,B,0,255,cv.NORM_MINMAX)
  1. 现在最大强度的位置给了我们物体的位置。如果我们期望图像中有一个区域,则对合适的值进行阈值处理将获得不错的结果。
ret,thresh = cv.threshold(B,50,255,0)

就是这样!!

OpenCV的反投影

OpenCV提供了一个内建的函数cv.calcBackProject()。它的参数几乎与cv.calchist()函数相同。它的一个参数是直方图,也就是物体的直方图,我们必须找到它。另外,在传递给backproject函数之前,应该对对象直方图进行归一化。它返回概率图像。然后我们用圆盘内核对图像进行卷积并应用阈值。下面是我的代码和结果:

import numpy as np
import cv2 as cv
roi = cv.imread('rose_red.png')
hsv = cv.cvtColor(roi,cv.COLOR_BGR2HSV)
target = cv.imread('rose.png')
hsvt = cv.cvtColor(target,cv.COLOR_BGR2HSV)
# 计算对象的直方图
roihist = cv.calcHist([hsv],[0, 1], None, [180, 256], [0, 180, 0, 256] )
# 直方图归一化并利用反传算法
cv.normalize(roihist,roihist,0,255,cv.NORM_MINMAX)
dst = cv.calcBackProject([hsvt],[0,1],roihist,[0,180,0,256],1)
# 用圆盘进行卷积
disc = cv.getStructuringElement(cv.MORPH_ELLIPSE,(5,5))
cv.filter2D(dst,-1,disc,dst)
# 应用阈值作与操作
ret,thresh = cv.threshold(dst,50,255,0)
thresh = cv.merge((thresh,thresh,thresh))
res = cv.bitwise_and(target,thresh)
res = np.vstack((target,thresh,res))
cv.imwrite('res.jpg',res)

以下是我处理过的一个示例。我将蓝色矩形内的区域用作示例对象,我想提取整个地面。

附加资源

  1. “Indexing via color histograms”, Swain, Michael J. , Third international conference on computer vision,1990.

欢迎关注磐创博客资源汇总站:
http://docs.panchuang.net/

欢迎关注PyTorch官方中文教程站:
http://pytorch.panchuang.net/

OpenCV中文官方文档:
http://woshicver.com/

OpenCV-Python 直方图-4:直方图反投影 | 二十九相关推荐

  1. OpenCV系列之直方图4:直方图反投影 | 二十九

    目标 在本章中,我们将学习直方图反投影. 理论 这是由Michael J. Swain和Dana H. Ballard在他们的论文<通过颜色直方图索引>中提出的. 用简单的话说是什么意思? ...

  2. pythonhistogram教程_OpenCV-Python 直方图-4:直方图反投影 | 二十九

    目标 在本章中,我们将学习直方图反投影. 理论 这是由Michael J. Swain和Dana H. Ballard在他们的论文<通过颜色直方图索引>中提出的. 用简单的话说是什么意思? ...

  3. 小甲鱼python笔记_小甲鱼《零基础学习Python》课后笔记(二十九):文件——一个任务...

    动动手 0.编写一个程序,接受用户的输入并保存为新的文件,程序实现如图: 代码如下:f_name = input('请输入文件名:') f = open(f_name, 'wt') print(&qu ...

  4. 技术 | Python从零开始系列连载(二十九)

    写爬虫防止被封的关键有以下几点: ●  伪装请求报头(request header)  ●  减轻访问频率,速度  ●  使用代理IP 一般第一点都能做到,第二点减轻访问频率就会大大增加任务时间,而使 ...

  5. Python遥感图像处理应用篇(二十九):遥感图像拉伸处理

    1.实验目的 将原始遥感图像各个波段拉伸到0-255范围显示. 运行环境:windows10 pycharm python3.7.7 GDAL-3.2.3-cp37-cp37m-win_amd64.w ...

  6. [Python从零到壹] 五十九.图像增强及运算篇之图像锐化Scharr、Canny、LOG实现边缘检测

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  7. [Python从零到壹] 三十九.图像处理基础篇之图像几何变换(镜像仿射透视)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  8. [Python从零到壹] 四十九.图像增强及运算篇之顶帽运算和底帽运算

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  9. OpenCV C++案例实战二十九《遥感图像分割》

    OpenCV C++案例实战二十九<遥感图像分割> 前言 一.准备数据 二.K-Means分类 三.效果显示 四.源码 总结 前言 本案例基于k-means机器学习算法进行遥感图像分割.主 ...

  10. Python遥感图像处理应用篇(二十二):Python+GDAL 批量等距离裁剪影像-续

    之前写过一篇按照指定行列号数量来进行影像等距离裁剪的博客,链接如下: Python遥感图像处理应用篇(二十二):Python+GDAL 批量等距离裁剪影像_空中旋转篮球的博客-CSDN博客_pytho ...

最新文章

  1. PHP 实现多网站共享用户SESSION 数据解决方案
  2. TFF 官方demo解释
  3. Conclusion
  4. cocoapods安装
  5. 线性代数 —— 矩阵快速幂
  6. python绘制正态分布函数_Python数据清洗(三):异常值识别与处理
  7. ie浏览器在线使用_关于登录深圳市住房公积金管理中心网站在线办理平台的温馨提示...
  8. python使用-使用python进行数据清洗
  9. UICollectionViewCell 所遇到的问题
  10. 【SSH进阶】java.lang.IllegalArgumentException: id to load is required for loading
  11. 关于神经网络的英语单词有,神经网络的英文单词
  12. Arduino Uno ADS1115 数模转换
  13. [IT名人堂]《人件》作者:汤姆.迪马可
  14. 听说看了这篇文章就彻底搞懂了什么是OPC(上)
  15. 温度报警器c语言课程设计,综合电子设计课程设计实验报告-可调温度报警器.doc...
  16. 个人计算机视觉学习路线
  17. 路由器开发整理(1)
  18. mysql5.7修改密码
  19. linux运行java程序内存过大_排查java应用linux环境内存占用过高的问题
  20. 微信小程序 java理发店美容院预约系统springboot

热门文章

  1. layui中实现动态的cols表头字段
  2. 网络营销之QQ推广技巧
  3. ROS创建KDL tree
  4. 苹果id是什么格式的_可以修改微信号了,怎样起一个好看又好记的微信号ID?...
  5. 华为大数据研发第1轮面试
  6. 软考中级软件设计师基础整理(1.计算机组成与体系结构)
  7. Windows 打开和关闭默认共享方法汇总
  8. 利用HY-SRF05 超声波模块实现超声波的测距避障
  9. Python爬虫之链家二手房数据爬取
  10. HLA RTI(Run-time Infrastructure)