首页 文章

opencv:matchTemplate与CCOEFF_NORMED的否定结果

提问于
浏览
0

我得到了几个应用程序图标并调整为36 * 36 . 我希望两者之间能够相似 . 我使用opencv函数 threshold 使它们成为黑白 . 我遵循其他问题的指示 . 我在方法 TM_CCOEFF_NORMED 上将 matchTemplate 应用于两个图标但得到否定结果,这让我感到困惑 . 基于doc,结果数组中不应有任何负数 . 任何人都可以向我解释为什么我得到一个负数并且这个负面意义有意义吗?

enter image description here

我尝试使用代码缩进错误编辑我的帖子时失败了一小时,即使我从编辑中删除了所有代码部分 . 太疯狂了 . 我尝试过灰度和黑白图标 . 当两个图标完全不同时,我总会得到负面结果 .

如果我使用尺寸为48 * 48的原始图标,事情进展顺利 . 我不知道它是否与我的调整大小步骤有关 .

#read in pics
im1 = cv2.imread('./app_icon/pacrdt1.png')
im1g = cv2.resize(cv2.cvtColor(im1, cv2.COLOR_BGR2GRAY), (36, 36), cv2.INTER_CUBIC)
im2 = cv2.imread('./app_icon/pacrdt2.png')
im2g = cv2.resize(cv2.cvtColor(im2, cv2.COLOR_BGR2GRAY), (36, 36), cv2.INTER_CUBIC)
im3 = cv2.imread('./app_icon/mny.png')
im3g = cv2.resize(cv2.cvtColor(im3, cv2.COLOR_BGR2GRAY), (36, 36), cv2.INTER_CUBIC)
#black&white convert
(thresh1, bw1) = cv2.threshold(im1g, 128 , 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
(thresh3, bw3) = cv2.threshold(im3g, 128 , 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
(thresh2, bw2) = cv2.threshold(im2g, 128 , 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
#match template
templ_match = cv2.matchTemplate(im1g, im3g, cv2.TM_CCOEFF_NORMED)[0][0]
templ_diff = 1 - templ_match

样品:

enter image description here

enter image description here

enter image description here

edit2:我将具有不同背景颜色或字体颜色的图标定义为非常相似(但观察者会知道它们与我的样本中的图像1和2完全相同) . 这就是我输入图标图片为黑白的原因 . 希望这是有道理的 .

1 回答

  • 0

    出现此问题的原因是两个图像的大小相同 .

    我尝试了相同的方法,但使用不同的图像大小 . 我曾经关注过以下图片:

    图像1:(125 x 108像素)图像

    enter image description here

    图像2:(48 x 48像素)模板

    enter image description here

    当我为这些图像运行给定代码时,它返回一个包含值的数组,其中每个值对应于某个像素周围的(图像)区域与模板(模板)匹配的程度 .

    现在,当您执行 cv2.minMaxLoc(templ_match) 时,它返回4个值:

    • 最小值:与模板比较时匹配图像中最小的像素

    • 最大值:与模板比较时,图像中匹配最多的像素

    • minimum_location:最小值出现的位置

    • maximum_location:最大值出现的位置

    这就是我得到的:

    Out[32]: (-0.15977318584918976, 1.0, (40, 12), (37, 32))
                        ^            ^       ^         ^
                        |            |       |         |
                    min_val       max_val  min_loc   max_loc
    

    当图像和模板具有不同尺寸时,观察到该结果 . 在您的情况下,您已将所有图像的大小调整为相同的大小,因此您只获得单个值,这是 templ_match 的第一个值 . 而且你必须避免做 templ_match = cv2.matchTemplate(im1g, im3g, cv2.TM_CCOEFF_NORMED)[0][0]

    而是执行 templ_match = cv2.matchTemplate(im1g, im3g, cv2.TM_CCOEFF_NORMED) ,然后使用以下方法获取最大值和最小值及其位置: cv2.minMaxLoc(templ_match)

相关问题