图像比较

时间:2009-08-19 06:21:45

标签: image-processing image-comparison

在视觉c中比较两个图像的有效方法是什么? 还有哪种格式的图像必须存储。(bmp,gif,jpeg .....)? 请提供一些建议

5 个答案:

答案 0 :(得分:2)

你的问题在复杂性方面打开了一堆蠕虫。

如果你想比较两个图像以检查它们 是否相同,那么你需要在文件上执行md5(删除可能会扭曲你的结果的可能的metainfos)。

如果你想比较他们是否相同,那么这完全是一个完全不同的故事。 “看起来相同”的含义非常宽松(例如,它们是完全相同的图像,但存储有两种不同的文件格式)。为此,您需要高级算法,这将为您提供两个图像相同的概率。不是该领域的专家,我会执行以下“我脑子里发明的”算法:

  • 从图像中获取任意一组像素点。
  • 每个像素“生长”周围像素的多边形(近HSV色彩空间)
  • 为其他图片做同样的事情
  • 对于一个图像的每个多边形,检查另一个图像中所有其他多边形的几何相似度,并选择最高值。将此值除以多边形的面积(进行标准化)。
  • 从获得的最高值中创建一个向量
  • 此向量的范数越高,两个图像相同的可能性就越高。

此算法应对颜色漂移和图像旋转不敏感。也许还缩放(你对该区域进行标准化)。但我重申:不是专家,可能会好得多,它可能会让小猫哭泣。

答案 1 :(得分:2)

如果您要比较的图片具有与众不同的特征,那么PCA是一个很好的方法。你需要什么格式的文件的问题确实无关紧要;你需要将它作为一组数字加载到程序中并进行分析。

答案 2 :(得分:2)

我做了类似的事情来检测来自MJPEG流的移动,并仅在移动发生时记录图像。

对于每个解码图像,我使用以下方法与之前的图像进行比较。

  • 将图像调整为有效缩略图大小(我将相当高分辨率的图像调整为10倍
  • 比较每个像素与前一个图像的亮度,并标记它是否更亮或更暗(阈值1)
  • 为每个像素完成后,您可以使用不同像素的数量来确定图像是相同还是不同(阈值2)

然后只需要调整两个阈值。

我使用System.Drawing.Bitmap进行了比较,但由于我的源图像是jpg,因此存在一些伪像。

如果您打算自己动手,这是一种比较差异的简单方法。

答案 3 :(得分:0)

如果你想确定2个图像在感知上是否相同,我相信最好的方法是使用图像哈希算法。您可以计算两个图像的哈希值,并且您可以使用哈希值来获得它们匹配的置信度。

我获得了一些成功的是pHash,虽然我不知道在Visual C中使用它有多容易。搜索“Geometric Hashing”或“Image Hashing”可能会有所帮助

答案 4 :(得分:0)

严格识别的测试很简单:只需将源图像A中的每个像素与图像B中的相应像素值进行比较。如果所有像素都相同,则图像相同。

但我想不想要这种严格的身份。您可能希望图像“相同”,即使某些转换已应用于图像B.这些转换的示例可能是:

  • 全局更改图像亮度(针对每个像素)
  • 局部改变图像亮度(对于某个区域中的每个像素)
  • 在golbally或local local更改图像饱和度
  • 伽马校正
  • 对图像应用某种滤镜(例如模糊,锐化)
  • 更改图片大小
  • 旋转

e.g。打印图像并再次扫描可能包括以上所有内容。

简而言之,您必须决定要将哪些转换视为“相同”,然后找到对这些转换不变的图像度量。 (或者,您可以尝试恢复翻译,但如果转换从图像中删除信息,则不可能,例如模糊或剪裁图像)