我有两张非常相似的图片(具体来说,是两张截图),我正试图找到最好(最快)的方法来查找图片的哪些区域发生了变化(作为代表不同区域的矩形数组)
一些标准:
- 它不需要像素精确,但必须包括所有变化,无论多么小(即,单个像素变化周围有很大误差是可以接受的)
- 它需要快速(理想情况下,在今天购买的典型消费类机器上,2x 1920x1080 图像应该花费 < 20 毫秒)
- 它不需要可配置的阈值(但如果有一个解决方案允许这样做,那将是一个不错的奖励)
- 可以假设输入图像总是完美的无损图像。
我有两个可行的解决方案,但一个是强力逐像素计算,这当然非常慢。对于另一个,我尝试将两个图像分成不同大小的 block 并计算每个 block 的校验和,但这也很慢。
只是为了那些想知道我正在构建什么的人 - 它是一种更笨(更慢)的远程桌面,可以在浏览器中使用而无需任何插件。
最佳答案
您需要对每个像素进行一个像素比较。我认为它不应该那么慢。例如代码:
int size = 1920 * 1080 * 3;
byte[] image1 = new byte[size];
byte[] image2 = new byte[size];
byte[] diff = new byte[size];
var sw = new System.Diagnostics.Stopwatch();
sw.Start();
for (int i = 0; i < size; i++)
{
diff[i] = (byte) (image1[i] - image1[i]);
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
在我的笔记本电脑上运行大约 40 毫秒。如果它只是灰度,它运行不到 20 毫秒。如果您使用真实图像数据,diff[i] != 0 将指示两个图像发生变化。
如果您使用 Bitmap.GetPixel 或其他慢速方法读取像素值,您的解决方案可能会很慢。如果是这种情况,我建议查看 Bitmap.LockBits 或使用不安全的方法。
关于c# - 快速计算两个相似图像之间的 'dirtied' 区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11931960/