0

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

4

5 回答 5

2

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

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

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

然后只需调整两个阈值即可。

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

如果您要自己滚动,这是一种比较图像差异的好方法。

于 2009-08-22T10:42:24.867 回答
2

就复杂性而言,您的问题打开了一堆蠕虫。

如果要比较两个图像以检查它们是否相同,则需要对文件执行 md5(删除可能会扭曲结果的可能元信息)。

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

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

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

于 2009-08-22T09:25:06.283 回答
2

如果您尝试比较的图像具有您想要区分的独特特征,那么PCA是一个很好的方法。您需要什么格式的文件的问题实际上无关紧要。您需要将其作为数字数组加载到程序中并进行分析。

于 2009-08-22T09:44:27.573 回答
0

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

我取得了一些成功的是pHash,尽管我不知道与 Visual C 一起使用它有多容易。搜索“几何散列”或“图像散列”可能会有所帮助。

于 2009-08-22T10:20:55.500 回答
0

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

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

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

例如,打印图像并再次扫描可能包括以上所有内容。

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

于 2009-08-22T10:31:37.133 回答