【问题标题】:Image comparison program (optimization required)图像比较程序(需要优化)
【发布时间】:2019-08-13 06:23:34
【问题描述】:
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;
    }
}

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

【问题讨论】:

  • 标题中的意思是压缩吗?

标签: c# image image-processing optimization


【解决方案1】:

如果我正确理解了您的意图。 您正在尝试在图像 (pic1) 上查找模板 (pic2) 并使用 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。 (大致)

【讨论】:

  • 你说得对,但是 (x,y) 线可以吗?我的意思是他们肯定会改变。
  • 你是对的,它们对于图像的比例是相同的。操作后,您必须将线按相同的比例放大。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-10
  • 2018-08-26
相关资源
最近更新 更多