如何知道两个图像是否相同?[关闭]


20

我有超过10000张图片,其中约2000张是其他格式的副本(例如JPEG,PNG,GIF)。这两个数字每天都在增加。我需要删除这些重复项,为此,我必须知道如何首先找到它们。

我的第一个想法是检查图像像素并查找在相同坐标中具有相同颜色像素的其他图片。但是此选项并不总是有效。假设我搜索重复项。至于可搜索对象,我选择一个8位PNG文件。它会找到该图像的所有副本,但只会找到8位PNG,有时是8位GIF,很少是JPEG(因为我想是图像算法吗?)。

我的第二个想法是复制所有这些图像,并在严格的两种颜色的调色板(例如,黑白)中对它们重新着色,并执行与上述相同的扫描。JPEG图像又不是100%与PNG或GIF格式相似(与上述相同的原因?)。

第三个想法是减少图像需要熟悉的百分比,增加颜色可以变化的百分比,从而导致不必要的图像去除...

有什么想法吗?



有损压缩的格式将导致图像与无损版本不完全相同。您必须具有命令行实用程序,还是可以运行提供建议的gui程序,然后显示具有> 90%相似像素的图像(计算平均偏差)?(当然,像素大小在任何格式下都应该相同)
thorstenmüller2011年


1
有多少个文件名相同但扩展名不同?
JeffO 2011年

4
不需要几周编码的有用答案:stackoverflow.com/questions/596262/…–
mac

Answers:


17

感知哈希可能是答案:

http://www.phash.org/

感知哈希是多媒体文件的指纹,该指纹是从内容的各种功能中派生而来的。与依赖于输入中的小变化导致输出中的急剧变化的雪崩效应的加密散列函数不同,如果特征相似,则感知散列彼此“接近”。


9
  1. 检查尺寸。如果不同=>图像不相同。
  2. 检查格式。如果相同=>执行精确比较,则逐像素进行比较。
  3. 如果使用不同的格式,请执行以下操作:

请勿比较RGB(红色,绿色,蓝色)。比较亮度为重量的一半,比较颜色/色相为另一半(或2 / 3rd vs 1 / 3rd)。计算值的差异,并根据“公差”值确定它们是否相同。

JPEG会严重压缩颜色信息,但不会破坏亮度值。


6

几年前,当我筛选一堆用于重复图像的图像时,我发现将所有内容缩小为8x8缩略图,然后根据缩略图之间的距离的平方(分别处理三种颜色)来计算相似度得分效果很好。请注意,您可以在内存中保存很多 8x8的缩略图。

几乎所有虚假对象的得分都低于非虚假对象,唯一的问题是即使实际内容有所不同(某些背景都是沙滩),某些图像的对比度也很低且总体相似。

这对于捕获重复图像也是有效的,除非有人为了减小文件大小而降低了分辨率或质量。


1
通常,YUV比RGB更好,对颜色平衡的细微变化不太敏感。
马丁·贝克特

这种用于预选潜在匹配项的缩略图技术是有效的,YUV是一种不错的选择,出于相同的原因,我已经看到它变成了纯亮度图。
Patrick Hughes

@Martin Beckett:我尝试的第一件事是RGB差异平方和,它工作得很好,以至于我没有尝试对其进行改进-当时它在编辑中引起了重复。使用对欺骗的严格定义,它足以让我自动删除它。
罗兰·佩希特尔

@Loren,如果它们是应该起作用的同一图像的较小像素编辑。仅仅是jpeg之类的东西会使RGB混乱,而不是YUV颜色空间。只是一个提示;-)
马丁·贝克特

从本质上讲,即使非常暗的图像根本不相似,它们的差平方和也往往较低。阈值可能会根据图片的平均亮度进行调整。我使用这种平均亮度作为预过滤器以避免O(n ^ 2)图像比较,因此它已经存在。
加百利

1

也许您应该编写一些代码来扫描图像是否相似。您可以将所有图片转换为ARGB格式并进行比较。(在记忆中)

一种可能的方法可能是这种方式:将图片划分为多个区域。扫描区域的平均颜色和/或亮度,以比较两张图片的相似度。

如果超过90%的区域匹配,则选择一个区域移至删除候选列表。这样,您就有了候选人列表。您可以使用图片的纵横比将图片分为水平图片和垂直图片,以加快比较速度。这样,您可以补偿有损算法,而不是逐像素再现正确的颜色。您可以在一夜之间运行该程序,早上可以在.Net中完成它:)使用GDI + lib可以很容易地完成。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.