图像比较程序(需要优化)

时间:2019-08-12 21:07:23

标签: c# image image-processing optimization

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 ms才能运行(尤其是这一部分:TemplateMatch[] matchings = tm.ProcessImage(pic1, pic2);)。您有什么想法/建议如何优化此功能?

1 个答案:

答案 0 :(得分:1)

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

假定尺寸“ pic1”为NxM,尺寸“ pic2”为KxL 所需的乘法总数与 N x M x K x L (大约)成正比,其中'x'为乘法。

一个简单的解决方案是:

  1. 首先按比例缩小图像(“ pic1”)和模板(“ pic2”),然后找到小版本。
  2. 如果需要更高的精度,可以将orginall pic1裁剪到步骤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。 (大约)