首页 > 解决方案 > 图像比较程序(需要优化)

问题描述

class Program
{
    static void Main(string[] args)
    {
        try
        {
            Bitmap pic1 = (Bitmap)Bitmap.FromFile(@"C:\SavedBMPs\1new.jpg");
            Bitmap pic2 = (Bitmap)Bitmap.FromFile(@"C:\SavedBMPs\2new.jpg");
            if (findIN(pic1, pic2))
            {
                Console.WriteLine("Found\n");
            }
            else
            {
                Console.WriteLine("Not Found\n");
            }
        }
        catch(Exception e)
        {
            Console.WriteLine(e);
        }

        Console.ReadKey();
    }

    static bool findIN(Bitmap pic1, Bitmap pic2)
    {
        bool found = false;
        ExhaustiveTemplateMatching tm = new ExhaustiveTemplateMatching(0.91f);
        TemplateMatch[] matchings = tm.ProcessImage(pic1, pic2);
        BitmapData data = pic1.LockBits( new Rectangle(0, 0, pic1.Width, pic1.Height), ImageLockMode.ReadWrite, pic1.PixelFormat);
        foreach (TemplateMatch m in matchings)
        {
            Drawing.Rectangle(data, m.Rectangle, Color.White);
            if (m.Rectangle.Location.X >= 0 && m.Rectangle.Location.Y >= 0)
            {
                found = true;
                Console.WriteLine("Upper Left : { X = " + (m.Rectangle.Location.X) + " , Y = " + (m.Rectangle.Location.Y) + " }");
                Console.WriteLine("Bottom Right : { X = "+(m.Rectangle.Location.X + pic2.Width) + " , Y = " + (m.Rectangle.Location.Y + pic2.Height)+" }");
            }
        }
        pic1.UnlockBits(data);
        return found;
    }
}

该程序2new.jpg在大图像中查找图像1new.jpg并返回其左上角(起始坐标)和下下角(结束坐标)。问题是这个程序太慢了,需要 13.126 毫秒才能运行(尤其是这部分:)TemplateMatch[] matchings = tm.ProcessImage(pic1, pic2);。您对如何优化此功能有任何想法/建议吗?

标签: c#imageimage-processingoptimization

解决方案


如果我正确理解你的意图。您正在尝试pic2在图像 ( ) 上找到模板 ( pic1) 并使用AForge.Net Framework.

假设维度“pic1”为 NxM,维度“pic2”为 KxL。所需的乘法总量与N x M x K x L(大致)成正比,其中“x”是乘法。

一个简单的解决方案是:

  1. 首先缩小图像(“pic1”)和模板(“pic2”)并在小版本中找到。
  2. 如果您需要更高的精度,您可以将 srop orginallpic1放到第 1 步中找到的区域 + 边距。并计算它的匹配。
  3. 找到的坐标应按相同比例放大。

例子

例如,主图像pic1的尺寸为 4000x4000 像素,模板“pic2”的尺寸为 100x100 像素。

计算总数成正比:

4000 x 4000 x 100 x 100 = 160,000,000,000。

如果我们先将大小减小 2(按比例缩小),我们会得到:

2000 x 2000 x 50 x 50 = 10,000,000,000 - 这意味着性能提高了 160/10=16。(大致)


推荐阅读