python opencv模板匹配参数详解
Python OpenCV模板匹配参数详解
在图像处理和计算机视觉中,模板匹配是一种常用的算法。它用于在一幅图像中查特定的目标。在Python OpenCV中,模板匹配是通过cv2.matchTemplate()函数实现的。该函数接受两个参数:输入图像和模板图像。它返回一个结果数组,该数组指示了每个像素处的匹配分值。
在进行模板匹配时,参数的选择至关重要。错误的参数选择可能会导致结果不准确。因此,本文将详细介绍Python OpenCV模板匹配的参数,帮助您获取更准确的匹配结果。
参数介绍
在Python OpenCV中,cv2.matchTemplate()函数的参数如下所示:
cv2.matchTemplate(img,template,method,result=None,mask=None)
其中,img是指用于查目标的输入图像,template是指将在img上查的模板图像。method
是指使用的匹配方法,result是可选的输出数组,mask是可选的掩码图像。
在这些参数中,method是最关键的参数。它决定了匹配算法的选择。以下是常用的匹配方法:
1. TM_SQDIFF
这是平方差匹配法。它在模板和输入图像之间计算像素值差的平方,并返回最佳匹配的位置。它的数学表达式如下:
R(x,y)=∑(i,j)(T(i,j)−I(x+i,y+j))^2
其中,I是输入图像,T是模板图像。R(x,y)是在点(x,y)处的匹配分值。
2. TM_SQDIFF_NORMED
这是归一化的平方差匹配法。它使用像素值差的平方来计算匹配分值,并将分值标准化为0到1之间的范围。
3. TM_CCORR
这是相关性匹配法。它计算模板和输入图像之间的互相关,并返回最佳匹配的位置。
4. TM_CCORR_NORMED
这是归一化的相关性匹配法。与TM_CCORR相似,但将分值标准化为0到1之间的范围。
5. TM_CCOEFF
rectangle函数opencv这是相关系数匹配法。它计算模板和输入图像之间的相关系数,并返回最佳匹配的位置。它的数学表达式如下:
R(x,y)=∑(i,j)(T(i,j)−T_)*(I(x+i,y+j)−I_)
其中,I是输入图像,T是模板图像。I_和T_是I和T的平均值,R(x,y)是在点(x,y)处的匹配分值。
6. TM_CCOEFF_NORMED
这是归一化的相关系数匹配法。与TM_CCOEFF相似,但将分值标准化为0到1之间的范围。
7. TM_CCORR_CCOEFF
这是相关性与相关系数匹配法的组合。在匹配时,首先使用相关性匹配法,在该方法的基础上使用相关系数匹配法。这种方法在高斯噪声下的表现要好于其他方法。
参数应用
使用模板匹配时,最常用的参数是method。下面是一些应用的示例。
1. 寻单个目标
假设我们有一张包含多个数字的图像,我们想在其中到一个特定的数字。以下是基于TM_CCORR_NORMED方法的代码:
import cv2 import numpy as np
img = cv2.imread('image.png',0) template = cv2.imread('template.png',0)
# 获取模板图像的宽和高 w, h = template.shape[::-1]
# 使用TM_CCORR_NORMED方法 res = cv2.matchTemplate(img,template,cv2.TM_CCORR_NORMED)
# 获取最佳匹配的位置 min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
# 绘制矩形边框 top_left = max_loc bottom_right = (top_left[0] + w, top_left[1] + h) angle(img,top_left, bottom_right, 255, 2)
# 显示结果 cv2.imshow('result',img) cv2.waitKey(0)
2. 寻多个目标
现在,我们假设我们要在一个图像中到多个目标。在这种情况下,我们需要使用一个循环来迭代图像的每个目标。以下是基于TM_CCORR_NORMED方法的代码:
import cv2 import numpy as np
img = cv2.imread('image.png',0) template = cv2.imread('template.png',0)
# 获取模板图像的宽和高 w, h = template.shape[::-1]
# 使用TM_CCORR_NORMED方法 res = cv2.matchTemplate(img,template,cv2.TM_CCORR_NORMED)
# 设置匹配阈值 threshold = 0.8
# 获取匹配结果的坐标 loc = np.where( res >= threshold)
# 绘制矩形边框 for pt in zip(*loc[::-1]): angle(img, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2)
# 显示结果 cv2.imshow('result',img) cv2.waitKey(0)
3. 寻旋转和缩放的目标
有时我们需要在缩放或旋转的图像中查目标。在这种情况下,我们需要使用RotationMatrix2D()函数和cv2.warpAffine()函数。以下是基于TM_CCORR_NORMED方法的代码:
import cv2 import numpy as np
img = cv2.imread('image.png',0) template = cv2.imread('template.png',0)
# 获取模板图像的宽和高 w, h = template.shape[::-1]
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论