'''
直方图反向投影是由 Michael J. Swain 和 Dana H. Ballard 在他们的
文章“Indexing via color histograms”中提出。
那它到底是什么呢?它可以用来做图像分割,或者在图像中找寻我们感兴
趣的部分。简单来说,它会输出与输入图像(待搜索)同样大小的图像,其中
的每一个像素值代表了输入图像上对应点属于目标对象的概率。用更简单的话
来解释,输出图像中像素值越高(越白)的点就越可能代表我们要搜索的目标
(在输入图像所在的位置)。这是一个直观的解释。直方图投影经常与 camshift
算法等一起使用。
我们应该怎样来实现这个算法呢?首先我们要为一张包含我们要查找目标
的图像创建直方图(在我们的示例中,我们要查找的是草地,其他的都不要)。
我们要查找的对象要尽量占满这张图像(换句话说,这张图像上最好是有且仅
有我们要查找的对象)。最好使用颜色直方图,因为一个物体的颜色要比它的灰
度能更好的被用来进行图像分割与对象识别。接着我们再把这个颜色直方图投
影到输入图像中寻找我们的目标,也就是找到输入图像中的每一个像素点的像
素值在直方图中对应的概率,这样我们就得到一个概率图像,最后设置适当的
阈值对概率图像进行二值化,就这么简单。
'''import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
import matplotlib#设置中文字体
matplotlib.rcParams['font.family'] = 'SimHei'#在messi.jpg图片中取一小块绿色区域,生成green.jpg文件
roi = cv.imread('green.jpg')
hsv = cv.cvtColor(roi,cv.COLOR_BGR2HSV)#在目标图中寻找绿色
target = cv.imread('messi.jpg')
hsvt = cv.cvtColor(target,cv.COLOR_BGR2HSV)'''
使用函数 cv2.calcHist() 来计算直方图既简单又方便。如果要绘制颜色
直方图的话,我们首先需要将图像的颜色空间从 BGR 转换到 HSV。(记住,
计算一维直方图,要从 BGR 转换到 HSV)。计算 2D 直方图,函数的参数要
做如下修改:
• channels=[0 ,1] 因为我们需要同时处理 H 和 S 两个通道。
• bins=[180 ,256]H 通道为 180,S 通道为 256。
• range=[0 ,180 ,0 ,256]H 的取值范围在 0 到 180,S的取值范围在0到256。
首先,我们要创建两幅颜色直方图,目标图像的直方图('M'),(待搜索)
输入图像的直方图('I')。
'''
roihist = cv.calcHist([hsv],[0, 1], None, [180, 256], [0, 180, 0, 256] )# 归一化:原始图像,结果图像,映射到结果图像中的最小值,最大值,归一化类型
#cv2.NORM_MINMAX 对数组的所有值进行转化,使它们线性映射到最小值和最大值之间
# 归一化之后的直方图便于显示,归一化之后就成了 0 到 255 之间的数了。
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)# threshold and binary AND
ret,thresh = cv.threshold(dst,50,255,0)
# 别忘了是三通道图像,因此这里使用 merge 变成 3 通道
thresh = cv.merge((thresh,thresh,thresh))
# 按位操作
res = cv.bitwise_and(target,thresh)plt.subplot(131), plt.imshow(target)
plt.title(u'原图'), plt.xticks([]), plt.yticks([])
plt.subplot(132), plt.imshow(thresh)
plt.title(u'二值化'), plt.xticks([]), plt.yticks([])
plt.subplot(133), plt.imshow(res)
plt.title(u'直方图反向投影'), plt.xticks([]), plt.yticks([])plt.show()

OpenCV学习20-直方图反向投影相关推荐

  1. opencv python 直方图反向投影_python OpenCV学习笔记直方图反向投影的实现

    本文介绍了python OpenCV学习笔记直方图反向投影的实现,分享给大家,具体如下: 它用于图像分割或寻找图像中感兴趣的对象.简单地说,它创建一个与我们的输入图像相同大小(但单通道)的图像,其中每 ...

  2. opencv进阶学习笔记7:直方图,直方图均衡化,直方图比较,直方图反向投影

    基础版传送门: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) 直方图基础讲解: opencv学 ...

  3. OpenCV中直方图反向投影算法详解与实现

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达本文转自:opencv学堂 一:直方图交叉 OpenCV中直方图反向 ...

  4. opencv 直方图_OpenCV之图像直方图反向投影

    python代码: import cv2 as cv import numpy as np from matplotlib import pyplot as pltdef back_projectio ...

  5. opencv 直方图反向投影

    转载至:http://www.cnblogs.com/zsb517/archive/2012/06/20/2556508.html 直方图反向投影式通过给定的直方图信息,在图像找到相应的像素分布区域, ...

  6. OpenCV + CPP 系列(十九)直方图比较 与 直方图反向投影,投影分割

    文章目录 一.直方图比较 计算公式 效果演示 二.直方图反向投影 三.投影分割 一.直方图比较 对输入的两张图像计算得到直方图H1与H2,归一化到相同的尺度空间,然后可以通过计算H1与H2的之间的距离 ...

  7. [python opencv 计算机视觉零基础到实战] 十五 直方图反向投影

    一.学习目标 了解了直方图反向投影的一般流程 了解2D直方图的使用 如有错误欢迎指出~ 二.了解直方图反向投影 2.1 了解2D直方图 需要对直方图进行反向投影,需要使用2D直方图.2D直方图需要使用 ...

  8. Mean Shift算法(2)在OpenCV上的实现目标跟踪——直方图反向投影

    直方图反向投影 直方图反向投影的结果是一个概率分布图,表示一个指定图像片段出现在特定位置的概率.假设我们已经知道图像中某个物体的大致位置,就可以用概率分布图找到物体的准确位置.最可能出现的位置就是窗口 ...

  9. Python+OpenCV:直方图反向投影(Histogram Backprojection)

    Python+OpenCV:直方图反向投影(Histogram Backprojection) Algorithm in Numpy 1. First we need to calculate the ...

  10. python-opencv 图像处理基础 (五)颜色直方图+直方图均衡化+直方图比较+直方图反向投影

    1.颜色直方图 #-------------------------------绘制颜色直方图------ import cv2 import numpy as np import matplotli ...

最新文章

  1. java beans 组件_如何利用JavaBeans在应用程序中创建组件?
  2. 【LeetCode】0938. 二叉搜索树的范围和(二叉树的遍历)
  3. DOS系统功能调用表(INT 21H)
  4. JAVA使用JDBC连接MySQL数据库
  5. java拦截器_Java工程师年底跳槽高潮即将到来,斩获满意offer的必备技巧(二)
  6. mysql添加字符串日期时间_mysql学习笔记--- 字符串函数、日期时间函数
  7. 厦门大学计算机学硕复试,【图片】一战厦大计算机上岸,经验帖。慢更【考研吧】_百度贴吧...
  8. 切单个图标为背景透明的方法
  9. 利用c++利用odbc连接mysql数据库
  10. H5商城与小程序商城哪个好_应该怎么选择_OctShop
  11. mysql 读写分离配置
  12. 第四天 轨道交通仿真入门
  13. RTI_DDS调试日志
  14. 基于Stm32f103硬件iic驱动LM75A温度传感器
  15. 云开发谁是卧底线下小游戏发牌助手微信小程序源码-亲测可用
  16. 贝茜的报复(dfs + 位运算)
  17. 协作图(Collaboration diagram)——UML之图七
  18. 幼儿园综合管理系统 v1.0 怎么用
  19. C++ QT开发人机象棋(鼠标点击)
  20. Ubuntu中编写C语言程序

热门文章

  1. 入门Webpack,看这篇就够了
  2. 深度解析布谷鸟过滤器(上篇)
  3. 欠拟合与过拟合及其解决方法
  4. python 余数a=k*b+r_python k相邻近算法之回归实操
  5. 想红必看!日漫十大最火题材
  6. 串联型或并联型电压基准的选择
  7. Error java: 程序包 不存在,解决
  8. html script 换行,JavaScript中怎么换行
  9. Android逆向之旅--「最右」签名算法解析(ARM指令学习恶心篇)
  10. 有关cto的种种杂记