本文共 2770 字,大约阅读时间需要 9 分钟。
1,直方图反向投影的原理
所谓反向投影就是首先计算某一特征的直方图模型,然后使用模型去寻找图像中存在的该特征。 反向投影可以通过颜色直方图来理解,我们检测图像中某个像素点的颜色是否位于直方图中,如果位于则将颜色加亮,通过对图像的检测,得出结果图像,结果图像一定和直方图像匹配。那么对于图像颜色的取样点越多,越能更好的找出目标图形。这里直方图的作用在于提供一个比较标准(也就是模版),即对于要检测的图像来说,需要给它提供一个模版,用于识别出和模版相应的特征。反向投影的作用:反向投影用于在输入图像(通常较大)中查找特定图像(通常较小或者仅1个像素,以下将其称为模板图像)最匹配的点或者区域,也就是定位模板图像出现在输入图像的位置。
反向投影查找原理:查找的方式就是不断的在输入图像中切割跟模板图像大小一致的图像块,并用直方图对比的方式与模板图像进行比较。
直方图反向投影矩阵的计算方法:
设有原灰度图像矩阵:
Image=
1 2 3 4 5 6 7 7 9 8 0 1 5 6 7 6 将灰度值划分为如下四个区间:[0,2] [3,5] [6,7] [8,10] 很容易得到这个图像矩阵的直方图hist= 4 4 6 2,接下来计算反向投影矩阵,反向投影矩阵的大小和原灰度图像矩阵的大小相同,原图像中坐标为(0,0)的灰度值为1,1位于区间[0,2] 中,区间[0,2] 对应的直方图值为4,所以反向投影矩阵中中坐标为(0,0)的值记为4 按上面的计算方法,可以得到Image的直方图反向投影矩阵为:back_Projection=
4 4 4 4 4 6 6 6 2 2 4 4 4 6 6 6 实际上是原图像的256个灰度值被置为很少的几个值了,具体有几个值,要看把0~255划分为多少个区间,反向投影矩阵中某点的值就是它对应的原图像中的点所在区间的灰度直方图值。所以我们可以看出,一个区间点越多,在反向投影矩阵中就越亮。我们是先求出原图像的直方图,再由直方图得到反向投影矩阵,由直方图到反向投影矩阵实际上就是一个反向的过程,所以叫反向。
2,直方图反向投影的应用 源代码:import cv2 as cvimport numpy as npfrom matplotlib import pyplot as pltdef back_projection_demo(): sample = cv.imread("F:/images/sample.png") target = cv.imread("F:/images/target.png") roi_hsv = cv.cvtColor(sample, cv.COLOR_BGR2HSV) target_hsv = cv.cvtColor(target, cv.COLOR_BGR2HSV) # show images cv.imshow("sample", sample) cv.imshow("target", target) roiHist = cv.calcHist([roi_hsv], [0, 1], None, [32, 32], [0, 180, 0, 256]) cv.normalize(roiHist, roiHist, 0, 255, cv.NORM_MINMAX) #归一化处理 """ 归一化就是要把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。归一化函数cv2.normalize原型:normalize(src, dst[, alpha[, beta[, norm_type[, dtype[, mask]]]]]) -> dst src参数表示输入数组。dst参数表示输出与src相同大小的数组,支持原地运算。alpha参数表示range normalization模式的最小值。beta参数表示range normalization模式的最大值,不用于norm normalization(范数归一化)模式。norm_type参数表示归一化的类型。norm_type参数可以有以下的取值:NORM_MINMAX:数组的数值被平移或缩放到一个指定的范围,线性归一化,一般较常用。NORM_INF:归一化数组的C-范数(绝对值的最大值)。NORM_L1 :归一化数组的L1-范数(绝对值的和)。NORM_L2 :归一化数组的(欧几里德)L2-范数。 """ dst = cv.calcBackProject([target_hsv], [0, 1], roiHist, [0, 180, 0, 256], 1) cv.imshow("backProjectionDemo", dst)"""函数原型:calcBackProject(images, channels, hist, ranges, scale[, dst]) -> dstimages参数表示输入图像(是HSV图像)。传入时应该用中括号[ ]括起来。channels参数表示用于计算反向投影的通道列表,通道数必须与直方图维度相匹配。hist参数表示输入的模板图像直方图。ranges参数表示直方图中每个维度bin的取值范围 (即每个维度有多少个bin)。scale参数表示可选输出反向投影的比例因子,一般取1"""def hist2d_demo(image): #2D直方图绘制(H[0, 180],S[0, 256]) hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV) hist = cv.calcHist([image], [0, 1], None, [32, 32], [0, 180, 0, 256]) #[32, 32]bins的个数(H,S)这是两个通道,bsize变少了,但是他的匹配更加广了(对于匹配的局限放宽了) plt.imshow(hist, interpolation='nearest') plt.title("2D Histogram") plt.show()src = cv.imread("F:/images/lena.png")cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)cv.imshow("input image", src)hist2d_demo(src)back_projection_demo()cv.waitKey(0)cv.destroyAllWindows()
运行结果:
转载地址:http://hxhwi.baihongyu.com/