图像模式匹配(如果存在返回坐标)

时间:2011-03-02 18:44:08

标签: c# image-processing image-manipulation

我目前在C#中试图找到一种在大图像中找到特定模式的方法,实际上是截图。需要100%匹配,所以问题非常简单。

测试材料: http://www.myhideout.eu/temp/pattern.png(注意:透明像素无关紧要,不应进行测试。) http://www.myhideout.eu/temp/test.png

如果找到了一个模式,我需要某种坐标,所以我知道在哪里,但这很容易。

到目前为止,我提出的唯一方法是明显的方法。获取模式的第一个像素并迭代测试图像直到找到匹配,然后测试模式的其余部分,直到测试失败或没有更多模式。如果测试失败,请继续下一个与模式的第一个像素匹配的像素,然后重试。如果你没有匹配地运行测试图像,那么显然没有这样的模式,那应该是测试的结果。

我的理论是有效的,但实际上事情有点复杂。我还没有用一种正确的方法来构建代码,我所做的测试用例有一些相当奇怪的错误,考虑到复杂性,这并不是一个大惊喜。

然而,我最关心的是时间。这只是漫长过程的一小部分,目标是将总执行时间缩短到几秒钟。想象一下1920 * 1200的图像,这是一个极限,模式在最后,在此之前发生了几次部分匹配。

我当然搜索网络,各种论坛等,但我提出的唯一材料是非常先进的,即使我设法理解它的目的是非常不同的目的,也没用。

我也一直在考虑是否可以将模式和测试图像转换为某种bitset,然后只是AND,SHIFT和/或MASK通过它,但这超出了我目前的能力。

我想我已经在这里描述了我的问题。对于代码示例的滞后,我感到很遗憾,但是我得到的东西对任何人都没用,也有点令人尴尬。

我非常感谢任何帮助。

4 个答案:

答案 0 :(得分:6)

答案 1 :(得分:1)

如果您可以保证图像的方向相同,那么您的简单实现可能是最快的。

但是,如果您要检查已旋转,转换为灰度或任何其他类型转换的图像,它将很快失败。

我没有任何代码,但Generation5(AI文章),特别是McGill University's COMP-644 (Pattern Recognition) course提供了一些很好的资源。

希望你喜欢数学。

答案 2 :(得分:0)

除了模式匹配的一般研究

  1. 搜索策略的描述听起来像是强力字符串搜索算法;您可以将优化的字符串搜索方法(例如Boyer Mooore)应用于您的问题吗?
  2. 查看您的模式和“干草堆” - 在寻找图标之前(快速?)搜索灰色框架可以提高执行速度。
  3. 如果您可以限制预期模式的区域并预处理模式,则可以选择使用OCR概念/代码。
  4. 当然,没有任何东西可以击败一个完全符合你想要的库。

答案 3 :(得分:0)

Using Aforge framework and Drawing.Imaging, worked for me!

    public static bool CompareBitmaps(Bitmap imageTemplate, Bitmap imagePattern)

    {
        ExhaustiveTemplateMatching tm = new ExhaustiveTemplateMatching(0.9f);
        // find all matchings with specified above similarity
        TemplateMatch[] matchings = tm.ProcessImage(imageTemplate, imagePattern);

        bool retorno = false;

        try
        {
            if (matchings[0].Similarity > 0.95f)
            {
                retorno = true;
            }
        }
        catch (Exception)
        {
            retorno = false;
        }

        return retorno;
    }