目标

在本章中将学习

  • 直方图反投影

理论

这是由Michael J. Swain和Dana H. Ballard在他们的论文《 Indexing via color histograms》中提出的。

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


反向投影矩阵中某点的值就是它对应的原图像中的点所在区间的灰度直方图值。所以我们可以看出,一个区间点越多,在反向投影矩阵中就越亮。

步骤如下:

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

从这个过程可以看出,先求出原图像的直方图,再由直方图得到反向投影矩阵,由直方图到反向投影矩阵实际上就是一个反向的过程,所以叫反向。

Numpy中的算法

  1. 首先,需要计算要查找的对象(使其为M)和要搜索的图像(使其为I)的颜色直方图。
import cv2
import numpy as np
from matplotlib import pyplot as plt
# roi is the object or region of object we need to find
roi = cv2.imread('rose_red.png')
hsv = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
# target is the image we search in
target = cv2.imread('rose.png')
hsvt = cv2.cvtColor(target, cv2.COLOR_BGR2HSV)
# Find the histograms using calcHist. Can be done with np.histogram2d also
M = cv2.calcHist([hsv],[0, 1], None, [180, 256], [0, 180, 0, 256] )
I = cv2.calcHist([hsvt],[0, 1], None, [180, 256], [0, 180, 0, 256] )
  1. 然后找到比例,R=MIR=\frac{M} {I} R=IM​
    即 使用R作为调色板,并使用每个像素创建新图像作为其目标的相应概率。B(x,y) = R[h(x,y),s(x,y)], 其中h和s表示像素点(x,y)处的色调(h),饱和度(s)。
h, s, v = cv2.split(hsvt)
B = R[h.ravel(), s.ravel()]
B = np.minimum(B,1)
B = B.reshape(hsvt.shape[:2])
  1. 现在用圆形核应用卷积, B = D ∗ B, 其中D是圆形卷积核
disc = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5))
cv2.filter2D(B,-1, disc, B)
B = np.uint8(B)
cv2.normalize(B,B,0,255, cv2.NORM_MINMAX)
  1. 现在最大强度的位置给了物体的位置。如果期望图像中有一个区域,则对合适的值进行阈值处理将获得不错的结果。
ret, thresh = cv2.threshold(B,50,255,0)

OpenCV的反投影

OpenCV提供了一个内建的函数cv2.calcBackProject()。它的参数几乎与cv2.calchist()函数相同。

dst = cv.calcBackProject( images, channels, hist, ranges, scale[, dst] )

  • images Source arrays. They all should have the same depth, CV_8U, CV_16U or CV_32F , and the same size. Each of them can have an arbitrary number of channels.
  • nimages Number of source images.
  • channels The list of channels used to compute the back projection. The number of channels must match the histogram dimensionality. The first array channels are numerated from 0 to images[0].channels()-1 , the second array channels are counted from images[0].channels() to images[0].channels() + images[1].channels()-1, and so on.
  • hist Input histogram that can be dense or sparse.
  • backProject Destination back projection array that is a single-channel array of the same size and depth as images[0] .
  • ranges Array of arrays of the histogram bin boundaries in each dimension. See calcHist .
  • scale Optional scale factor for the output back projection.
  • uniform Flag indicating whether the histogram is uniform or not (see above).

在传递给backproject函数之前,应该对对象直方图进行归一化。它返回概率图像。然后我们用圆盘内核对图像进行卷积并应用阈值。下面是我的代码和结果:

import numpy as np
import cv2
from matplotlib import pyplot as pltroi = cv2.imread('roi.png')  # 感兴趣的图片 绿色草地
hsv = cv2.cvtColor(roi, cv2 .COLOR_BGR2HSV)target = cv2.imread('messi.png')  # 目标图片
hsvt = cv2.cvtColor(target, cv2.COLOR_BGR2HSV)# calculating object histogram
roihist = cv2.calcHist([hsv], [0, 1], None, [180, 256], [0, 180, 0, 256] )# normalize histogram and apply backprojection
cv2.normalize(roihist,roihist,0,255,cv2.NORM_MINMAX)
dst = cv2.calcBackProject([hsvt], [0, 1], roihist, [0,180,0,256],1)# Now convolute with circular disc
disc = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
cv2.filter2D(dst,-1,disc,dst)# threshold and binary AND
ret,thresh = cv2.threshold(dst, 50, 255, 0)
thresh = cv2.merge((thresh,thresh,thresh))
res = cv2.bitwise_and(target,thresh)cv2.imshow('res', res)
cv2.waitKey()
cv2.destroyAllWindows()

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


可以用于目标检测和分割

附加资源

  • https://docs.opencv.org/4.1.2/dc/df6/tutorial_py_histogram_backprojection.html
  • Indexing via color histograms”, Swain, Michael J. , Third international conference on computer vision,1990.
  • https://docs.opencv.org/4.1.2/d6/dc7/group__imgproc__hist.html#ga3a0af640716b456c3d14af8aee12e3ca
  • https://blog.csdn.net/shuiyixin/article/details/80331839
  • https://blog.csdn.net/jia20003/article/details/73136986

opencv23:Histogram直方图反向投影相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. opencv 直方图反向投影

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

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

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

最新文章

  1. 基于三维点云数据的主成分分析方法(PCA)的python实现
  2. 3/14课程 第三章 结构化的项目前期和面向对象的项目前期实例
  3. mysql+提升更新语句效率_MySQL加快批量更新 UPDATE优化
  4. Java第十次作业--多线程
  5. Redis-主从复制
  6. magento模板制作教程(一)
  7. 来瓶82年拉菲压压惊
  8. 5.1 Zend_Log_Writer
  9. APP自动化测试-2. Appium录制测试用例
  10. 常见电子元器件的极性识别方法
  11. IMU惯性测量单元是什么?
  12. 大家说说有必要免费建网站吗?
  13. 心田花开:小学三年级语文下册古诗词整理【全】
  14. Android项目开发之--------地铁时光机(二,Floyd算法筛选最短路径及输出)
  15. 1224. 简单迷宫问题
  16. html让底部文字居中,网站底部版权居中-html css怎么让文字在页面底部居中
  17. 10分钟白嫖我的常用的在线工具网站清单
  18. 钉钉在线课程开启屏幕共享时电脑蓝屏问题解决办法
  19. 360safe.php绕过,venom结合Metasploit绕过360安全卫士
  20. 数独挑战之九宫格入门第一题解题思路

热门文章

  1. 干货 | 4步带你完成私有云盘搭建
  2. 揭秘 Win8 电脑 OEM 分区创建
  3. Windows文件名太长无法删除
  4. 摄像机DSP芯片介绍
  5. 流程图 自定义函数_让客户信任感倍增?酷家乐推出“自定义清单”功能,为精准报价加码!...
  6. 『光纤交换机级联设置 』光纤跳线及光纤交换机端口级联类型
  7. mysql 根据经纬度查询范围点
  8. 打造自己备份的系统镜像
  9. 桌面被关闭,如何在任务管理器中打开桌面?
  10. android怎么删除插件,Android手机如何添加删除桌面图标和插件