快速计算两个相似图像之间的"脏污"区域

Pho*_*cUK 8 .net c# image-processing

我有两个非常相似的图像(具体来说,两个截图),我试图找到最好(最快)的方式来查找图像的哪些区域已经改变(作为代表不同区域的矩形阵列)

一些标准:

  • 它不需要像素精确,但必须包括所有变化但是很小(即单像素变化可以接受它周围有很大的误差范围)
  • 它需要很快(理想情况下,2x 1920x1080图像在今天购买的典型消费者机器上应该小于20ms)
  • 它不需要可配置的阈值(但如果有一个允许这个的解决方案,那将是一个很好的奖励)
  • 可以假设输入图像总是完美无损图像.

我有两个工作解决方案,但其中一个是逐个像素计算,这当然是非常慢的.另一方面,我尝试将两个图像分成不同大小的块并计算每个块的校验和,但这也很慢.

只是为那些想知道我正在构建什么的人 - 它是一种可以在没有任何插件的浏览器中使用的笨重(和较慢)的远程桌面.

小智 3

您需要逐个像素进行比较。我认为不应该这么慢。例如代码:

        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);
Run Code Online (Sandbox Code Playgroud)

在我的笔记本电脑上运行大约需要 40 毫秒。如果只是灰度,则运行时间不到 20 毫秒。如果您使用真实图像数据,则diff[i] != 0将指示两个图像中的变化。

如果您使用Bitmap.GetPixel或其他慢速方法读取像素值,您的解决方案可能会很慢。如果是这种情况,我建议查找 Bitmap.LockBits使用不安全的方法。