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

问题描述 投票:0回答:5

我目前正在用 C# 尝试找出一种在大图像(实际上是屏幕截图)中查找特定模式的方法。需要 100% 匹配,因此问题非常简单。

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

如果找到模式,我需要某种坐标,以便我知道在哪里,但这是简单的部分。

到目前为止我想出的唯一方法是显而易见的。获取图案的第一个像素并迭代测试图像,直到找到匹配,然后测试图案的其余部分,直到测试失败或不再有图案。如果测试失败,请继续处理与图案的第一个像素匹配的下一个像素,然后重试。如果您运行测试图像而没有匹配,那么显然不存在这样的模式,这应该是测试的结果。

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

然而,我最关心的是时间。这只是一个漫长过程的一小部分,目标是将总执行时间减少到几秒钟。想象一张 1920*1200 的图像,这大约是极限,其中模式位于末尾,并且在此之前发生了几个部分匹配。

我当然搜索过网络、各种论坛等,但我想到的唯一材料非常先进,即使我设法理解它的用途非常不同,也没什么用处。

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

我想我已经在这里描述了我的问题。我对代码示例的滞后感到抱歉,但我所得到的对任何人都没有什么用处,而且还有点令人尴尬。

我将非常感谢任何帮助。

c# image-processing image-manipulation
5个回答

1
投票

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

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

我没有任何代码给你,但是Generation5(人工智能文章)有一些很好的资源,特别是来自麦吉尔大学的 COMP-644(模式识别)课程

希望你喜欢数学。


0
投票

除了模式匹配的一般研究

  1. 你的搜索策略的描述听起来像是暴力字符串搜索算法;您可以将优化的字符串搜索方法(例如 Boyer Mooore)应用于您的问题吗?
  2. 查看您的模式和“干草堆” - 在寻找图标之前(快速?)搜索灰色框架应该可以提高执行速度。
  3. 如果您可以限制预期模式的区域并对模式进行预处理,那么使用 OCR 概念/代码可能是一种选择。

当然,没有什么比一个完全满足您需求的库更好的了。


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;
    }

0
投票

我会将图像和图案尺寸减小到扫描速度更快的程度,以这种方式查找紧密匹配,然后使用全尺寸图案在全尺寸图像中测试这些结果。

© www.soinside.com 2019 - 2024. All rights reserved.