OpenCV模板匹配和透明度

mnn*_*mnn 30 opencv image-processing computer-vision template-matching

OpenCV在模板匹配期间处理图像透明度的方式是什么?

问题是模板图像需要有透明的部分,因为在原始图像中,这些地方可能有任何东西.

我尝试了所有的方法,但没有一个产生积极的结果(例如原始图像中模板的位置未被正确检测到).

mpe*_*kov 18

看起来OpenCV并不像你想要的那样处理alpha.

您有两种选择:

  1. 编写您自己的使用alpha通道的互相关方法
  2. 转换图像,使您的Alpha通道变得无关紧要

由于第一个选项很简单,我将在这里探讨第二个选项.我将重新使用我之前提供的类似问题的示例代码.如果直接对图像应用互相关,则背景会干扰模板匹配(特别是浅色背景部分).如果您使用颜色通道,您会发现蓝色通道中的匹配可以得到正确的结果.这取决于图像内容,并不是解决问题的一致方法.

另一种选择是对图像和模板执行边缘检测(例如Sobel),然后执行互相关.这是边缘检测图像(我使用GIMP中Luma通道上的Sobel边缘检测器,然后进行一些强度拉伸).

地图

建造

正如您所看到的,此处的Alpha通道已变得无关紧要,因为大多数地形已变为零强度,并且不会对互相关计算做出贡献.所以现在可以直接应用互相关,得到所需的结果:

misha@misha-desktop:~/Desktop/stackoverflow$ python cross-correlation.py map-blue.png building-maskz-blue.png 
(163, 244)
Run Code Online (Sandbox Code Playgroud)

最后,这是另一个相关的问题.

PS.这场比赛是什么?


kit*_*rol 10

对于这个问题,我有一个稍微有点脑死亡的解决方案,实际上似乎运行得相当好:用模糊图像的alpha通道替换噪声,这或多或少使得透明区域在匹配过程中在统计上无关紧要.

例如,我的用例涉及在iOS的屏幕截图中搜索表情符号字符.iOS键盘背景会根据上下文更改颜色,如果您在模板图像中提交特定背景颜色,则会使匹配过程出现问题.

这是alpha上的原始模板图像:
alpha上的原始模板图像

这是处理过的模板,为alpha通道填充了噪音:
在此输入图像描述

我通过OpenCV文档中提供的模板匹配示例代码发送了处理过的模板图像.在黑暗或浅色背景下,找到匹配合理的匹配.

在深色背景上搜索:

在黑暗中匹配

在浅色背景上搜索:

在光线上匹配

相比之下,将模板的Alpha通道保持透明 - 或者提交到深色或浅色背景 - 并未返回可接受的匹配.

  • 您的解决方案是一个运行不良的解决方法。如果图像相同,通常 matchTemplate() 会返回 99% 甚至 100% 的匹配确定性,但您的示例图像解决方案会为匹配图像返回 23% 的确定性。下一个不匹配的图像(笑脸之一)为 11%。这是匹配 (23%) 和非匹配 (11%) 图像之间的一个非常糟糕的距离。笑脸与您的模板图像完全不同。因此,此解决方法很大程度上取决于您用于区分匹配和不匹配的阈值。您的解决方案给出的结果非常微弱 (3认同)
  • 因此,更好的解决方法如下:在第一步中使用您的方法(噪声模板)来查找匹配的匹配项(matchTemplate()),然后在第二步中将透明部分掩盖为黑色:模板和在第一步找到的位置的主图像,以获得真正的确定性(高达100%). (2认同)

小智 9

OpenCV 3.0为与模板匹配的模板匹配提供原生支持.请参阅新文档:

参数:

图片 ...

时间......

结果......

方法 ...

掩码 搜索模板的掩码.它必须与templ具有相同的数据类型和大小.默认情况下不设置.

[轻微的题外话]

请注意,模板与屏蔽参考图像(较大图像)匹配是不可能的.这是有道理的,因为OpenCV使用基于FFT的模板匹配.

因此,如果您只需要在参考图像的特定区域执行模板匹配,则需要为此实现自己的方法或屏蔽cv :: matchTemplate的输出.

从头开始实施它可以补偿您只想在非常特定的区域(即:哈里斯角落周围)搜索模板的情况.