【发布时间】:2012-08-13 09:56:09
【问题描述】:
我有两个非常相似的图像(特别是两个屏幕截图),我正在尝试找到最好(最快)的方法来查找图像的哪些区域发生了变化(作为代表不同区域的矩形数组)
几个标准:
- 它不需要是像素精确的,但必须包括所有变化,无论多么小(即,单像素变化周围有很大的误差是可以接受的)
- 需要快速(理想情况下,在今天购买的典型消费类机器上,2x 1920x1080 图像应该花费
- 它不需要可配置的阈值(但如果有解决方案允许这样做,那将是一个不错的奖励)
- 可以假设输入图像始终是完美的无损图像。
我有两种可行的解决方案,但一种是蛮力逐像素计算,这当然非常慢。对于另一个,我尝试将两个图像分成不同大小的块并计算每个块的校验和,但这也很慢。
仅供那些想知道我在构建什么的人使用 - 它是一种更笨(也更慢)的远程桌面,无需任何插件即可在浏览器中使用。
【问题讨论】:
-
OpenCV 是一个很好的图像处理库。也就是说,如果你不坚持自己编程,我发现 addictivetips.com/windows-tips/… 似乎有点类似。
-
我很高兴使用外部库,但它需要非 GPL 的良好 C# 绑定(LGPL、BSD、Apache 许可证很好 - 只是不是“病毒”许可证)和一些文档关于有助于我实现这一点的功能。
-
您必须比较图像之间的每个像素 - 没有办法绕过它。您目前如何进行比较?您是否已经在使用非托管代码?
-
我没有使用任何非托管或不安全的代码。只是与 GetPixel() 的比较。如果可能的话,我宁愿纯粹保留在托管代码中(但使用带有托管包装器的现有非托管库就可以了,只要包装器也在 Mono 中编译)
-
是的
GetPixel()非常慢。使用LockBits:example here。您将不得不用非托管内存和指针弄脏自己的手,但这并不难。
标签: c# .net image-processing