基于颜色的模板匹配行为

6
我正在评估模板匹配算法以区分相似和不同的对象。我发现有些困惑,我曾经认为模板匹配是一种比较原始像素强度值的方法。因此,当像素值变化时,我期望模板匹配会给出一个较低的匹配百分比。
我有一个模板和搜索图像,形状和大小相同,仅颜色不同(附有图片)。当我做模板匹配时,令人惊讶地得到了大于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的各个通道中进行匹配,但在所有情况下都得到了较好的匹配百分比。

非常感谢任何帮助。


我很感兴趣。你尝试过使用深色模板吗?比如深蓝色/红色? - Jeru Luke
从这里我们可以得出结论,它高度依赖于边缘而不是颜色。接下来,尝试匹配一个相同颜色的正方形(或任何其他形状)。 - Jeru Luke
1
@Yves:我已经检查了OpenCV源代码的实现,并确保没有进行任何转换,但仍然无法得到物理解释和涉及的数学。 - Karthik
1
OpenCV实际上使用不同的“线性空间滤波”方法,而不是强度比较。 - Rick M.
在进行模板匹配之前,您需要进行HS反投影。 - Pavel Gridin
显示剩余4条评论
2个回答

2
res = cv2.matchTemplate(img, template, cv2.TM_CCORR_NORMED)

有多种参数可用于查找模板,例如cv2.TM_CCOEFFcv2.TM_CCOEFF_NORMEDcv2.TM_CCORRcv2.TM_CCORR_NORMEDcv2.TM_SQDIFFcv2.TM_SQDIFF_NORMED

你可以在这里查看它们的方程:

https://docs.opencv.org/2.4/modules/imgproc/doc/object_detection.html

我认为,如果你想使用模板匹配来避免匹配不同颜色的形状,则应该使用CV_TM_SQDIFF或可能是cv2.TM_CCOEFF_NORMED。 相关项给出最大值的匹配,平方差项给出最小值的匹配。因此,如果您具有精确的形状和大小,尽管颜色不同,您将得到高相关性值(请参见上面链接中的方程式)。


8
谢谢,FYI我已经测试了文档中提到的所有6种方法,即使它们有颜色差异,它们都与目标匹配。 - Karthik

1

概念:

假设X=(X_1,X_2,....X_n),Y=(Y_1,Y_2,...,Y_n)满足对于所有i,有Y_i=a * X_i,其中a为正常数,则 (所有X_i * Y_i的和)=a * (所有(X_i)^2的和)=平方根(所有(X_i)^2的和)* 平方根(所有(a * X_i)^2的和)。 因此(所有X_i * Y_i的和)/(平方根(所有(X_i)^2的和)*平方根(所有(Y_i)^2的和))= 1。

在您的情况下,X代表您的模板图像,几乎只有两种颜色,背景是黑色,即0,前景颜色是常数c。Y代表您图像的ROI,也几乎只有两种颜色,背景是0,前景颜色是另一个常数d。所以我们有a=d/c来满足上述概念。因此,如果我们使用cv2.TM_CCORR_NORMED,则得到接近1的结果是我们期望的。

关于 cv2.TM_CCOEFF_NORMED,如果对于所有的 i,Y_i=a * X_i+b,其中 b 是某个常数,a 是某个正常数,则 X 和 Y 之间的相关系数为 1(基本统计学)。因此,如果我们使用 cv2.TM_CCOEFF_NORMED,则得到接近 1 的结果是我们所期望的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接