c# - 快速计算两个相似图像之间的 'dirtied' 区域

标签 c# .net image-processing

我有两张非常相似的图片(具体来说,是两张截图),我正试图找到最好(最快)的方法来查找图片的哪些区域发生了变化(作为代表不同区域的矩形数组)

一些标准:

  • 它不需要像素精确,但必须包括所有变化,无论多么小(即,单个像素变化周围有很大误差是可以接受的)
  • 它需要快速(理想情况下,在今天购买的典型消费类机器上,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/

相关文章:

javascript - 确定旋转矩形的坐标

image-processing - OpenCV 中的形状上下文匹配

c# - 部署后Az​​ure函数应用程序设置为空

c# - 为什么我的 TimeSpan.Add() 不工作?

.net - 是否允许终结器调用其他托管类的方法?

c# - 如何从 HttpListenerRequest 获取表单参数?

c++ - 将矩阵中的 16 位写入文本文件,在 C++ 中以不同的方式读回它们

c# - 异步更新属性

javascript - 发送要从网站打印的文档并提交表单

c# - 知道什么 id 不存在