opencv:matchTemplate 的否定结果 CCOEFF_NORMED
opencv: negative result of matchTemplate with CCOEFF_NORMED
我得到了几个应用程序图标并将其调整为 36*36。我希望得到其中任何两个之间的相似性。我用opencv函数threshold
把它们变成了黑白。我遵循其他问题的说明。我在两个图标上应用 matchTemplate
和方法 TM_CCOEFF_NORMED
但得到的结果是否定的,这让我很困惑。
基于 doc 结果数组中不应有任何负数。谁能向我解释为什么我得到一个负数,这个负数有意义吗?
我尝试编辑我的 post 失败一小时,代码缩进错误,即使我从我的编辑中删除了所有代码部分。太疯狂了。我已经尝试过图标的灰度和黑白。当两个图标完全不同时,我总是会得到负面结果。
如果我使用48*48大小的原始图标,一切顺利。不知道是不是和我的resize步骤有关
#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
样本:
edit2:我将具有不同背景颜色或字体颜色的图标定义为非常相似的图标(但观众会知道它们与我的示例中的图像 1 和 2 完全相同)。这就是为什么我将图标图片输入为黑白的原因。希望这是有道理的。
出现此问题是因为两个图像的大小相同。
我尝试了相同的方法,但使用了不同的图像尺寸。我曾经关注以下图片:
图片 1:(125 x 108 像素)图片
图片 2:(48 x 48 像素)模板
当我 运行 这些图像的给定代码时,它返回一个包含值的数组,其中每个值对应于特定像素周围的区域(图像)与模板(模板)的匹配程度。
现在当你执行 cv2.minMaxLoc(templ_match)
它时 returns 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)
我得到了几个应用程序图标并将其调整为 36*36。我希望得到其中任何两个之间的相似性。我用opencv函数threshold
把它们变成了黑白。我遵循其他问题的说明。我在两个图标上应用 matchTemplate
和方法 TM_CCOEFF_NORMED
但得到的结果是否定的,这让我很困惑。
基于 doc 结果数组中不应有任何负数。谁能向我解释为什么我得到一个负数,这个负数有意义吗?
我尝试编辑我的 post 失败一小时,代码缩进错误,即使我从我的编辑中删除了所有代码部分。太疯狂了。我已经尝试过图标的灰度和黑白。当两个图标完全不同时,我总是会得到负面结果。
如果我使用48*48大小的原始图标,一切顺利。不知道是不是和我的resize步骤有关
#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
样本:
edit2:我将具有不同背景颜色或字体颜色的图标定义为非常相似的图标(但观众会知道它们与我的示例中的图像 1 和 2 完全相同)。这就是为什么我将图标图片输入为黑白的原因。希望这是有道理的。
出现此问题是因为两个图像的大小相同。
我尝试了相同的方法,但使用了不同的图像尺寸。我曾经关注以下图片:
图片 1:(125 x 108 像素)图片
图片 2:(48 x 48 像素)模板
当我 运行 这些图像的给定代码时,它返回一个包含值的数组,其中每个值对应于特定像素周围的区域(图像)与模板(模板)的匹配程度。
现在当你执行 cv2.minMaxLoc(templ_match)
它时 returns 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)