c# - 图像比较程序(需要优化)
问题描述
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);
。您对如何优化此功能有任何想法/建议吗?
解决方案
如果我正确理解你的意图。您正在尝试pic2
在图像 ( ) 上找到模板 ( pic1
) 并使用AForge.Net Framework
.
假设维度“pic1”为 NxM,维度“pic2”为 KxL。所需的乘法总量与N x M x K x L(大致)成正比,其中“x”是乘法。
一个简单的解决方案是:
- 首先缩小图像(“pic1”)和模板(“pic2”)并在小版本中找到。
- 如果您需要更高的精度,您可以将 srop orginall
pic1
放到第 1 步中找到的区域 + 边距。并计算它的匹配。 - 找到的坐标应按相同比例放大。
例子
例如,主图像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。(大致)