Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv 基于颜色的模板匹配行为_Opencv_Image Processing_Colors_Template Matching - Fatal编程技术网

Opencv 基于颜色的模板匹配行为

Opencv 基于颜色的模板匹配行为,opencv,image-processing,colors,template-matching,Opencv,Image Processing,Colors,Template Matching,我正在评估模板匹配算法,以区分相似和不同的对象。我发现令人困惑的是,我对模板匹配的印象是一种比较原始像素强度值的方法。因此,当像素值发生变化时,我希望模板匹配提供的匹配百分比较小 我有一个模板和搜索图像具有相同的形状和大小不同,只是在颜色(图片附件)。当我进行模板匹配时,我得到的匹配百分比大于90% img = cv2.imread('./images/searchtest.png', cv2.IMREAD_COLOR) template = cv2.imread('./images/templ

我正在评估模板匹配算法,以区分相似和不同的对象。我发现令人困惑的是,我对模板匹配的印象是一种比较原始像素强度值的方法。因此,当像素值发生变化时,我希望模板匹配提供的匹配百分比较小

我有一个模板和搜索图像具有相同的形状和大小不同,只是在颜色(图片附件)。当我进行模板匹配时,我得到的匹配百分比大于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通道中尝试过。在所有情况下,我都获得了很好的百分比

任何帮助都将不胜感激

res = cv2.matchTemplate(img, template, cv2.TM_CCORR_NORMED)
您可以使用各种参数来查找模板,例如
cv2.TM_-cceeff
cv2.TM_-cceeff-NORMED
cv2.TM_-CCORR
cv2.TM_-CCORR-NORMED
cv2.TM_-SQDIFF
cv2.TM-SQDIFF-NORMED

您可以在此处查看他们的方程式:

根据我的想法,如果你想使用模板匹配,这样它就不会匹配不同颜色的形状,那么你应该使用CV_TM_SQDIFF或者cv2.TM_cceff_NORMED。 相关项为最大值提供匹配,平方差项为最小值提供匹配。因此,如果您有精确的形状和大小,而不是相同的颜色,您将获得较高的相关性值(参见上面链接中的等式)。

概念:

假设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)=平方根(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_赋范,如果Y_i=a*X_i+b表示所有i和一些常数b以及一些正常数a,那么X和Y之间的相关系数为1(基本统计)。因此,如果我们使用cv2.TM_cFeff_NORMED,我们得到的结果接近1,这是我们预期的结果。

谢谢,仅供参考,我已经测试了文档中提到的所有6种方法,并且所有这些方法都与对象匹配,尽管它们存在色差。我很感兴趣。您是否使用深色模板尝试过相同的方法?类似深蓝色/红色的东西?这让我很困扰,因为你问我尝试了深红色模板,它匹配率为75%,尽管没有得到背后的原因。从这一点我们可以得出结论,它高度依赖于边缘,而不是颜色。接下来,尝试匹配相同颜色的正方形(或任何其他形状)。@Yves:我已经检查了OpenCV的源代码实现,并确保没有发生转换,但没有得到物理解释,涉及的数学实际上使用了不同的方法,而不是强度比较