我正在评估模板匹配算法,以区分相似和不相似的对象。我发现令人困惑的是,我对模板匹配的印象是一种比较原始像素强度值的方法。因此,当像素值变化时,我预期模板匹配会给出较少的匹配百分比。
我有一个模板和搜索图像,其形状和大小相同,只有颜色不同(附图像)。当我进行模板匹配时,我的匹配百分比大于90%。
img = cv2.imread('./images/searchtest.png', cv2.IMREAD_COLOR)
template = cv2.imread('./images/template.png', cv2.IMREAD_COLOR)
res = cv2.matchTemplate(img, template, cv2.TM_CCORR_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
print(max_val)
有人可以告诉我为什么会这样吗?我甚至在HSV色彩空间,全BGR图像,全HSV图像,B,G,R的单独通道和H,S,V的单个通道中尝试了这一点。在所有情况下,我获得了很高的比例。
真的很感激任何帮助。
答案 0 :(得分:1)
概念:
假设X =(X_1,X_2,.... X_n),Y =(Y_1,Y_2,...,Y_n)满足Y_i = a * X_i对于所有i和一些正常数a,则 (所有X_i * Y_i的总和)= a *((X_i)^ 2的总和)= SquareRoot((X_i)^ 2的总和)* SquareRoot((a * X_i)^ 2的总和)。 因此(所有X_i * Y_i的总和/(SquareRoot((X_i)^ 2的总和)* SquareRoot((Y_i)^ 2的总和))= 1。
在您的情况下,X代表模板图像,几乎只有两种颜色,背景是黑色,即0,前景色是常数c。 Y代表图像的ROI,也几乎只有两种颜色,背景为0,前景色为另一个常数d。因此我们有a = d / c来满足上述概念。因此,如果我们使用cv2.TM_CCORR_NORMED,我们得到的结果将接近1,这正是我们的预期。
对于cv2.TM_CCOEFF_NORMED,如果对于所有i以及某个常数b和某个正常数a,Y_i = a * X_i + b,则X和Y之间的相关系数为1(基本统计)。因此,如果我们使用cv2.TM_CCOEFF_NORMED,我们得到的结果接近1,这就是我们的预期。
答案 1 :(得分:0)
res = cv2.matchTemplate(img,template,cv2.TM_CCORR_NORMED)
您可以使用各种参数来查找模板,例如'cv2.TM_CCOEFF','cv2.TM_CCOEFF_NORMED','cv2.TM_CCORR','cv2.TM_CCORR_NORMED','cv2.TM_SQDIFF','cv2.TM_SQDIFF_NORMED' 你可以在这里查看他们的等式:
https://docs.opencv.org/2.4/modules/imgproc/doc/object_detection.html
根据我的想法,如果你想使用你的模板匹配,使它不匹配不同颜色的形状,那么你应该使用CV_TM_SQDIFF或cv2.TM_CCOEFF_NORMED。 相关项给出最大值的匹配,平方差项给出最小值的匹配。因此,如果您的形状和大小确切,但颜色不同,您将获得较高的相关值(请参阅上面链接中的等式)。