匹配干草堆位图中的图案/针(最好是位图)?

时间:2009-12-21 18:23:02

标签: .net image-processing

我在代码(.NET)中有两个位图。我想在大图像(haystack)中搜索小图案(针)。怎么办呢?

4 个答案:

答案 0 :(得分:1)

您可能希望查看“edge detection”这个通用术语,了解您要执行的操作。

这两个链接看起来很有用,但与图像处理相比,颜色注册更多:

  1. Codeproject: Edge Detection
  2. Edge Detection in C#
  3. 你想要做的是:

    1. 将“查找”图片剪切为最小尺寸
    2. 反转“查找”图像并确保边缘尽可能干净(具有高渐变)
    3. 扫描“目标”图像并检测所有边缘
    4. 将“目标”图像细分为“查找”大小的部分(加上一些错误),并且仅采用边缘数量较多的区域
    5. “目标”中的Foreach部分XOR部分上的“查找”图像(根据需要递增)并查看结果阈值是否低于检测到的阈值
    6. 因此,基本原则是剪切“查找”图像,将其反转(稍后进行XOR),找到目标图像中的所有边缘,然后将XOR贴图应用于这些区域并找到最高匹配百分比。

      或者,如果图像足够小,您可以“滑动”应用相同的技术,反转查找图像,并在“目标”图像上滑动以查找匹配。

      这些技术的主要问题是什么构成了“匹配”,它通常不会是100%匹配,并且你必须有一些代码来处理这种情况。

      如果您需要这样做,我建议您找一个已经执行此操作的库,例如Reed建议的那样。如果你想自己动手,花一些时间在维基百科和Codeproject上查看图像处理库。

答案 1 :(得分:1)

这取决于您是使用按位模式进行“精确”匹配还是仅进行近似(模糊)图像匹配。如果您正在进行完全匹配,只需将位图视为通用的2D数据阵列搜索。

可以在N * M时间内进行完全匹配的简单但非常简单的实现,其中N是大海捞针中的像素数,M是针中的像素数。

鉴于Haystack的大小(S,T)和Needle Bitmap的大小(U,V),您可以在Haystack上迭代X = [0,S-U)& Y = [0,T-V)。对于每个位置,您可以查看与针[[X,Y},{X + U,Y + V})大小相同的2D子阵列,并将其与针[{0,0},{进行比较U,V})坐标。

答案 2 :(得分:0)

您可以通过Image Registration执行此操作,但我不知道可以直接使用的(好).NET库。

如果你愿意使用C ++,Insight Toolkit有许多工具可以帮助你做到这一点,包括你的“草堆”不能精确匹配“针”的能力(即:“模糊”)搜索/匹配)。

答案 3 :(得分:0)

我绝不是图像处理方面的专家。在这里只是想着一个想法:)

假设您查看针中的一行像素。这一行可以为计算给定行的校验和提供基础,所以我们称之为指纹。现在,您可以使用相同的校验和搜索大海捞针中相同长度的子集中的所有水平线。找到水平候选人后,您可以检查每个水平候选人。

这个算法的问题显然是它的速度。如果您在水平指纹上有很多匹配的情况下是O(可怕)(例如,如果你选择了顶线,它将是所有黑色 - 在大海捞针中显示很多的模式),所以不知何故你必须选择具有良好,独特行为的指纹。

我确信有很多更好的方法可以做到,但我想我会分享我的想法:)

祝你好运