python - matchTemplate 中的正确方法
问题描述
在我的项目中,我必须在一张图像中使用两个不同的模板来搜索形状(两种类型)。对于每种类型,每个图像有零个或一个形状,导致 4 种可能的结果(两种形状都存在;两种形状都不存在;1 个不存在,1 个存在,反之亦然)。形状可以重叠。我必须特别小心两种形状的误报检测(即错误模板在其他形状上具有最高匹配),这比误报要糟糕得多。模板由黑色(即接近零强度)几何形状(十字)组成,并且与灰色到白色的背景(通常为 1:100 的对比度)具有非常高的对比度,这应该会有很大帮助。不涉及视角的改变。形状可以旋转,但只能以小角度(< 1 度),
因此,我得出结论,matchTemplate
来自 openCV 的模板匹配应该是一种有效的工具(排除由于旋转/缩放而可能出现的小问题)。根据这篇文章的输入(理解和评估模板匹配方法),我认为TM_SQDIFF_NORMED
orTM_CCOEFF_NORMED
方法会做得很好,特别是TM_CCOEFF_NORMED
我希望对我的图像中确实出现的照明不太敏感。经过测试,我意识到在使用这两种方法中的任何一种进行模板搜索后,在结果矩阵中获得的最佳匹配值(最小值TM_SQDIFF_NORMED
,最大值TM_CCOEFF_NORMED
)取决于另一种方法的存在图像中的形状。因此我想到了使用模板匹配的可选掩码参数;将搜索限制在模板中形状的确切区域(仅用零填充)。但是,它不适用于这些方法中的任何一种(仅针对方法TM_SQDIFF
和编码TM_CCORR_NORMED
)。
这似乎导致了一些不幸的权衡: 1/ 使用TM_SQDIFF
orTM_CCORR_NORMED
和对应于每个形状的蒙版具有限制一个形状对另一个形状的影响的优势,但我知道我会对照明差异变得更加敏感;或 2/ 继续使用TM_SQDIFF_NORMED
orTM_CCOEFF_NORMED
但我无法预测它将导致的结果,因为每个形状的分数将始终取决于另一个形状的存在。
或者,我可以使用带有掩码的可能性来执行我自己的功能进行模板搜索TM_CCOEFF_NORMED
,但是非常耗时,而且我不能自信地告诉我这是要走的路。
为了选择正确的阈值,我计划实施一条 ROC 曲线,该曲线将有利于尽可能低的误报率,即使它可能以较低的真阳性率(至少一开始)为代价,这意味着一个相当高的阈值。
一般来说,我想在开始编写其他代码之前征求反馈意见。甚至可能这matchTemplate
不是最好的方法。提前致谢。
解决方案
推荐阅读
- reactjs - 数据更新时多次调用 FlatList、renderItem
- xaml - 如何使用 .csproj MSBuild 有条件地在 Xamarin.Forms 项目中包含 XAML ResourceDictionary
- go - gRPC 客户端不使用服务器端流
- python - 计算购物清单中食物的卡路里
- c# - 将日期时间转换为自定义格式
- laravel - 如何登录主域和子域多租户?
- python - 删除二进制阈值图像中具有连接边缘的小破折号
- azure - 将多行合并为具有百分比贡献的单行
- java - 我必须在 FutureTask 中手动处理中断吗?
- android - 如何为风味变体创建两个不同版本的代码