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

一、学习目标

  1. 了解了直方图反向投影的一般流程
  2. 了解2D直方图的使用

如有错误欢迎指出~

二、了解直方图反向投影

2.1 了解2D直方图

需要对直方图进行反向投影,需要使用2D直方图。2D直方图需要使用calcHist方法。calcHist方法在前两节中已经有了解,现在再来复习一下。首先我们查看calcHist方法的原型。

calcHist(images; channels; mask; histSize; ranges[; hist[; accumulate]])

calcHist方法中images参数为所需要传入的图像,接受类型为uint8以及float32,参入参数时可以使用[]对参数进行标记;
channels为传入的通道数;
mask为一个遮罩,如果为None则表示对全图进行操作,若选择其中一个部分就需要制作一个遮罩对局部进行操作;
histSize为一个范围,或者说是BIN的数目;
ranges表示像素值范围。

我们要绘制一个颜色直方图的话,需要对BGR色彩空间进行转换,转换为HSV:

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread(r'C:\Users\mx\Desktop\1.jpg')

hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

随后我们使用calcHist方法传入数值,这个时候channels应该为[0,1],mask我们依旧为None,因为我们需要处理全图;而histSize则表示了两个通道,H以及S,所以应该写成[180,256],即H通道为180,S通道为256,最后一个range则为[0,180,0,256],表示H取值范围在和S的取值范围。那么整体的代码如下:

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread(r'C:\Users\mx\Desktop\1.jpg')

hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

hist = cv2.calcHist([hsv], [0,1], None, [180,256], [0,180,0,256])

plt.imshow(hist, interpolation='nearest')
plt.show()

结果如下:

2.2 了解直方图反向投影

直方图反向投影可以在图像中找到我们感应区的部分,直方图反向投影将会输出模板图像中类似的部分,越亮的的部分则表示得越白。我们需要完成这个操作首先得有一张需要查找的对象,随后需要一张图为查找区域。我们可以先对需要查找目标的图像创建一个直方图,随后进行归一化处理。归一化处理使用normalize方法。
首先我们进行读取图片与转换HSV色彩空间图,也顺带一起读取目标扫描的图片,原图和目标图、代码如下:
原图:

目标图:

roi = cv2.imread(r'C:\Users\mx\Desktop\gz\roi.png')
hsv_roi = cv2.cvtColor(roi,cv2.COLOR_BGR2HSV)
target = cv2.imread(r'C:\Users\mx\Desktop\gz\4.png')
hsv_target = cv2.cvtColor(target,cv2.COLOR_BGR2HSV)

随后对hsv_roi 感兴趣的部分进行2D直方图处理:

roihist = cv2.calcHist([hsv_roi],[0, 1], None, [180, 256], [0, 180, 0, 256] )

接下来使用normalize方法进行归一化;归一化是将数据达到一种可进行对比的标准,但是保持了原有数据间的关系。代码为:

cv2.normalize(roihist,roihist,0,255,cv2.NORM_MINMAX)

其中roihist为输入数据,roihist为与src大小相同的输出数据,0为一个范围低边界,255为范围的上限,cv2.NORM_MINMAX是一个归一化的方法,表示对数组的所有值进行转化,使值的映射在最小值和最大值之间。这样归一化后他们的值就在0到255之间了。接着我们使用calcBackProject方法,calcBackProject方法与calcHist的参数类似。 cvCalcBackProject 用于计算直方图的反向投影,得到的结果是数组在某个分布下的概率。

dst = cv2.calcBackProject([hsv_target],[0,1],roihist,[0,180,0,256],1) 

随后使用getStructuringElement方法进行卷积,把分散点连接:

gSEE = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
dst=cv2.filter2D(dst,-1,gSEE)

接着使用阀值方法:

ret,thresh = cv2.threshold(dst,50,255,0)

最后进行合并:

trh = cv2.merge((trh,trh,trh))

完整代码如下:

import cv2
import numpy as np
from matplotlib import pyplot as plt

roi = cv2.imread(r'C:\Users\mx\Desktop\gz\roi.png')
hsv_roi = cv2.cvtColor(roi,cv2.COLOR_BGR2HSV)
target = cv2.imread(r'C:\Users\mx\Desktop\gz\4.png')
hsv_target = cv2.cvtColor(target,cv2.COLOR_BGR2HSV)

roihist = cv2.calcHist([hsv_roi],[0, 1], None, [180, 256], [0, 180, 0, 256] )
cv2.normalize(roihist,roihist,0,255,cv2.NORM_MINMAX)
dst = cv2.calcBackProject([hsv_target],[0,1],roihist,[0,180,0,256],1)
gSEE = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
dst=cv2.filter2D(dst,-1,gSEE)
ret,trh = cv2.threshold(dst,50,255,0)
trh = cv2.merge((trh,trh,trh))
cv2.imshow('trh',trh)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果如下:

当然我们也可以进行位运算,这样我们就可以取出颜色部分了,所有完整代码如下:

import cv2
import numpy as np
from matplotlib import pyplot as plt

roi = cv2.imread(r'C:\Users\mx\Desktop\gz\roi.png')
hsv_roi = cv2.cvtColor(roi,cv2.COLOR_BGR2HSV)
target = cv2.imread(r'C:\Users\mx\Desktop\gz\4.png')
hsv_target = cv2.cvtColor(target,cv2.COLOR_BGR2HSV)

roihist = cv2.calcHist([hsv_roi],[0, 1], None, [180, 256], [0, 180, 0, 256] )
cv2.normalize(roihist,roihist,0,255,cv2.NORM_MINMAX)
dst = cv2.calcBackProject([hsv_target],[0,1],roihist,[0,180,0,256],1)
gSEE = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
dst=cv2.filter2D(dst,-1,gSEE)

ret,trh = cv2.threshold(dst,50,255,0)
trh = cv2.merge((trh,trh,trh))
cv2.imshow('trh',trh)
res = cv2.bitwise_and(target,trh)
cv2.imwrite('res.jpg',res)
cv2.imshow('res',res)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果如下:

我们也可以换一下图:
roi:

目标:

结果:

该系列首发于ebaina

已标记关键词 清除标记
相关推荐
VC6下安装与配置 Wikipedia,自由的百科全书 本手册适应 OpenCV 1.0 安装。 目录 [隐藏] 1 安装Visual C++ 6.0 2 安装OpenCV 3 配置Windows环境变量 4 配置Visual C++ 6.0 4.1 全局设置 4.2 项目设置 [编辑]安装Visual C++ 6.0 略。 [编辑]安装OpenCV 从http://www.opencv.org.cn/ 下载OpenCV安装程序。假如要将OpenCV安装到C:\\Program Files\\OpenCV。(下面附图为OpenCV 1.0rc1的安装界面,OpenCV 1.0安装界面与此基本一致。)在安装时选择\"将\\OpenCV\\bin加入系统变量\"(Add\\OpenCV\\bin to the systerm PATH)。 [编辑]配置Windows环境变量 检查C:\\Program Files\\OpenCV\\bin是否已经被加入到环境变量PATH,如果没有,请加入。 [编辑]配置Visual C++ 6.0 [编辑]全局设置 菜单Tools->Options->Directories:先设置lib路径,选择Library files,在下方填入路径: C:\\Program Files\\OpenCV\\lib 然后选择include files,在下方填入路径: C:\\Program Files\\OpenCV\\cxcore\\include C:\\Program Files\\OpenCV\\cv\\include C:\\Program Files\\OpenCV\\cvaux\\include C:\\Program Files\\OpenCV\\ml\\include C:\\Program Files\\OpenCV\\otherlibs\\highgui C:\\Program Files\\OpenCV\\otherlibs\\cvcam\\include [编辑]项目设置 每创建一个将要使用OpenCV的VC Project,都需要给它指定需要的lib。菜单:Project->Settings,然后将Setting for选为All Configurations,然后选择右边的link标签,在Object/library modules附加上 cxcore.lib cv.lib ml.lib cvaux.lib highgui.lib cvcam.lib 如果你不需要这么多lib,你可以只添加你需要的lib。
©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页
实付 29.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值