网站 活动页面,网络设计方案的组成部分,如何设置网站子域名,做演示的网站一、学习目标
了解了直方图反向投影的一般流程了解2D直方图的使用
如有错误欢迎指出~
二、了解直方图反向投影
2.1 了解2D直方图
需要对直方图进行反向投影#xff0c;需要使用2D直方图。2D直方图需要使用calcHist方法。calcHist方法在前两节中已经有了解#xff0c;现在…一、学习目标
了解了直方图反向投影的一般流程了解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 pltimg cv2.imread(rC:\Users\mx\Desktop\1.jpg)hsv cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
随后我们使用calcHist方法传入数值这个时候channels应该为[0,1]mask我们依旧为None因为我们需要处理全图而histSize则表示了两个通道H以及S所以应该写成[180,256]即H通道为180S通道为256最后一个range则为[0,180,0,256]表示H取值范围在和S的取值范围。那么整体的代码如下
import cv2
import numpy as np
from matplotlib import pyplot as pltimg cv2.imread(rC:\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, interpolationnearest)
plt.show()结果如下
2.2 了解直方图反向投影
直方图反向投影可以在图像中找到我们感应区的部分直方图反向投影将会输出模板图像中类似的部分越亮的的部分则表示得越白。我们需要完成这个操作首先得有一张需要查找的对象随后需要一张图为查找区域。我们可以先对需要查找目标的图像创建一个直方图随后进行归一化处理。归一化处理使用normalize方法。 首先我们进行读取图片与转换HSV色彩空间图也顺带一起读取目标扫描的图片原图和目标图、代码如下 原图
目标图
roi cv2.imread(rC:\Users\mx\Desktop\gz\roi.png)
hsv_roi cv2.cvtColor(roi,cv2.COLOR_BGR2HSV)
target cv2.imread(rC:\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))
dstcv2.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 pltroi cv2.imread(rC:\Users\mx\Desktop\gz\roi.png)
hsv_roi cv2.cvtColor(roi,cv2.COLOR_BGR2HSV)
target cv2.imread(rC:\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))
dstcv2.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 pltroi cv2.imread(rC:\Users\mx\Desktop\gz\roi.png)
hsv_roi cv2.cvtColor(roi,cv2.COLOR_BGR2HSV)
target cv2.imread(rC:\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))
dstcv2.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