图像预处理-模板匹配
最后更新时间:
文章总字数:
预计阅读时间:
就是用模板图在目标图像中不断的滑动比较,通过某种比较方法来判断是否匹配成功,找到模板图所在的位置。
不会有边缘填充。
类似于卷积,滑动比较,挨个比较象素。
返回结果res大小是:目标图大小-模板图大小+1(H-h+1,W-w+1)
一.匹配方法
res=cv2.matchTemplate(image, templ, method)
image:原图像,这是一个灰度图像或彩色图像(在这种情况下,匹配将在每个通道上独立进行)。
templ:模板图像,也是灰度图像或与原图像相同通道数的彩色图像。
method:匹配方法,可以是以下之一:
cv2.TM_CCOEFF
cv2.TM_CCOEFF_NORMED
cv2.TM_CCORR
cv2.TM_CCORR_NORMED
cv2.TM_SQDIFF
cv2.TM_SQDIFF_NORMED
返回值res,每个元素表示原图像中相应位置与模板图像匹配的相似度,而每个元素的位置其实就是对应匹配位置的左上角元素位置。匹配方法不同,返回矩阵的值的含义也会有所区别。以下是几种常用的匹配方法及其返回值含义:
cv2.TM_SQDIFF 或 cv2.TM_SQDIFF_NORMED:
返回值越接近0,表示匹配程度越好。最小值对应的最佳匹配位置。
cv2.TM_CCORR 或 cv2.TM_CCORR_NORMED:
返回值越大,表示匹配程度越好。最大值对应的最佳匹配位置。
cv2.TM_CCOEFF 或 cv2.TM_CCOEFF_NORMED:
返回值越大,表示匹配程度越好。最大值对应的最佳匹配位置。
1.1 平方差匹配(cv2.TM_SQDIFF)
以模板图与目标图所对应的像素值使用平方差公式来计算,其结果越小,代表匹配程度越高。如图:
1.2 归一化平方差匹配(cv2.TM_SQDIFF_NORMED)
与平方差匹配类似,只不过需要将值统一到0到1,计算结果越小,代表匹配程度越高。如图:
1.3 相关匹配(cv2.TM_CCORR)
使用对应像素的乘积进行匹配,乘积的结果越大其匹配程度越高。如图:
1.4 归一化相关匹配(cv2.TM_CCORR_NORMED)
与相关匹配类似,只不过是将其值统一到0到1之间,值越大,代表匹配程度越高。如图:
1.5 相关系数匹配(cv2.TM_CCOEFF)
先计算模板与目标图像的均值,然后通过每个像素与均值之间的差的乘积再求和来表示其匹配程度,1表示完美的匹配,-1表示最差的匹配。如图:
1.6 归一化相关系数匹配(cv2.TM_CCOEFF_NORMED)
将相关系数匹配的结果统一到0到1之间,值越接近1代表匹配程度越高。如图:
二.绘制轮廓
设定一个匹配阈值来筛选出多个匹配程度高的区域,找出数组中所有大于0.8的元素索引:
loc=np.where(array > 0.8)
获取轮廓点:
zip(*loc)
*loc 是解包操作,将 loc 中的多个数组拆开,作为单独的参数传递给 zip。
zip 将这些数组按元素一一配对,生成一个迭代器,每个元素是一个元组,表示一个坐标点。
1 |
|
结果:
1 |
|
这里有一个注意点,那就是将原图灰度化后,是不能使用(b,g,r)三通道颜色赋值的,而黑色很难看出来,所以使用白色(255,255,255)绘制矩形。
1 |
|
结果: