【问题标题】:Determine the differences between two nearly identical photographs确定两张几乎相同的照片之间的差异
【发布时间】:2010-10-23 20:09:44
【问题描述】:

这是一个相当广泛的问题;有哪些工具/库可以拍摄两张不相同但极其相似的照片,并确定它们之间的具体差异?

例如,在我女朋友完成清洁工作之后,以及在一个长周末与朋友聚会、喝酒和演奏摇滚乐队之前,给我的沙发拍照。两天后,我拍了第二张沙发的照片;灯光相同,沙发没有移动一毫米,我在固定位置使用三脚架。

我可以使用哪些工具来生成图像差异或差异的第三张热图图像? .NET 有什么工具吗?

【问题讨论】:

    标签: image image-processing comparison diff


    【解决方案1】:

    只需使用 .net 成像类,创建一个新的 bitmap() x 2 并查看每个像素的 R & G & B 值,如果您愿意,还可以查看 A(Alpha/透明度)值在确定差异时。

    还要注意,使用 getPixel(y, x) 方法可能会非常慢,还有另一种方法可以获取整个图像(不太优雅),如果我记得它被称为 getBitmap 或类似的东西,查看成像/位图类并阅读一些教程,它们确实是你所需要的,而且使用起来并不难,除非你必须,否则不要去第三方。

    【讨论】:

    • ps:如果您需要更多资源/帮助,请给我发电子邮件,我在这门课上花了 2 年时间 :)
    【解决方案2】:

    我使用我公司制作的工具包 (DotImage) 编写了这个免费的 .NET 应用程序。它有一个非常简单的算法,但是如果你想使用它,代码是开源的——如果你不想购买 DotImage 的副本,你可以将算法改编为 .NET Image 类。

    http://www.atalasoft.com/cs/blogs/31appsin31days/archive/2008/05/13/image-difference-utility.aspx

    【讨论】:

      【解决方案3】:

      查看 Andrew Kirilov 在 CodeProject 上的 article。他使用AForge.NET 计算机视觉库编写了一个C# 应用程序来检测运动。在 AForge.NET 网站上,有一个 discussion 用于运动检测的两帧差异。

      【讨论】:

        【解决方案4】:

        这是一个有趣的问题。我不能向您推荐任何特定的库,但您所询问的过程基本上是运动补偿的最小情况。这就是 MPEG(MP4、DIVX 等)视频能够非常出色地压缩视频的方式;您可以查看 MPEG 以了解有关这些运动补偿算法的实现方式的一些信息。

        要记住的另一件事; JPEG压缩是一种基于块的压缩; MPEG 从事物中带来的大部分好处是实际进行块比较。如果您的大部分图像(例如背景)从一张图像到另一张图像都是相同的,那么这些块将保持不变。这是一种减少需要比较的数据量的快速方法。

        【讨论】:

        • 您甚至可以从前图像的副本和后图像的副本组合成一个短片。用 MPEG 压缩它,然后分析结果.... ;-)
        【解决方案5】:

        从一个丰富的图像处理库开始,例如IM。您可以使用IMlab 工具以交互方式涉足其运算符,直接从 C 或 C++ 调用它,或者使用其真正体面的 Lua 绑定从 Lua 驱动它。它支持对位图的各种操作,以及可扩展的文件格式库。

        即使您没有刻意移动任何内容,您也可能希望使用SIFT 等算法在帧之间获得良好的亚像素质量对齐。除非您想要将相机视为固定的并同时检测沙发的运动。

        【讨论】:

        • 这正是我既害怕又希望得到的答案;我不是 C 或 C++ 或 Lua 开发人员——但这看起来是一个有趣的项目,可以让我的脚/躯干/头部/呼吸管湿透。我可能会不知所措,但我想这就是我提到呼吸管的原因
        • 如果您深入了解,您会想看看它的配套库 CD 和 IUP。 CD 提供了用于在位图(或屏幕)上绘图的通用画布,而 IUP 提供了可移植的 UI 框架。链接位于 IMLab 页面。在 www.lua.org 上通过官方邮件列表提供了很多 Lua 帮助,以及用户到用户 wiki,或者在此处标记为“lua”以在您需要时充当非常重要的通气管。 ;-)
        【解决方案6】:

        查看每个微小的、通常几乎无法察觉的差异的最明显方法是对像素数据进行异或运算。但是,如果照明略有不同,则可能太多了。差分(减去)像素数据可能更符合您的要求,具体取决于差异的细微程度。

        【讨论】:

        • 我一定要玩这个;这可能是我可以在我的技能水平范围内从零开始开发的少数​​几种方法之一
        • 如果您想在自己编写代码之前查看这些方法的实际效果,请查看任何分层光栅图形编辑器的图层合成模式。 Paint.NET 是我正在考虑的,但它是一个基本的二进制像素操作,所以所有实现都应该是相同的。
        【解决方案7】:

        这在很大程度上取决于图像格式和压缩。但是,归根结底,您可能会获取两个栅格并逐个像素地比较它们。

        看看Perceptual Image Difference Utility

        【讨论】:

        • 感谢您的链接,我一定会玩这个,看看它是否是我正在做的事情的一个很好的起点。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-04
        • 2017-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-07
        相关资源
        最近更新 更多