删除重复的图像
c#
image-processing
4
0

我们收集了几百个演出的照片图像。大量照片在视觉上是重复的,但文件大小,分辨率,压缩率等不同。

是否可以使用任何特定的图像处理方法来搜索并删除这些重复的图像?

参考资料:
Stack Overflow
收藏
评论
共 5 个回答
高赞 时间 活跃

实际上,我编写了一个可以完成此任务的应用程序

我从一个以前的应用程序开始,该应用程序使用基本的Levenshtein距离算法来计算图像相似度,但是由于多种原因,该方法是不可取的。毫无疑问,用于确定图像相似性的最快算法是均方误差均绝对误差 (两者的运行时间均为O(n),其中n是图像中的像素数,并且以多种不同的方式对这两种算法的实现进行线程化也很简单)。 Mecki的帖子实际上只是我的应用程序可以执行的“均值绝对错误”实现(如果您愿意,也可以提供代码来提高您的浏览乐趣)。

无论如何,在我们的应用程序中,我们首先对图像进行下采样(例如,将所有图像缩放到32 * 32像素),然后转换为灰度,然后通过比较算法运行生成的图像。我们还在研究一些更高级的预处理算法,以进一步对图像进行规范化,但是……还不止于此。

肯定有比MSE / MAE更好的算法(实际上,已经很好地证明了这两种算法应用于视觉信息的问题),例如SSIM ,但这是有代价的。其他人试图比较图像中的其他视觉质量,例如亮度,对比度,颜色直方图等,但是与简单地测量误差信号相比,这都是昂贵的。

我的应用程序可能会运行 ,具体取决于这些文件夹中有多少个图像。它是多线程的(我已经看到它完全加载了八个处理器内核来执行比较),但是我从未针对大于几百个图像的图像数据库进行过测试。几百个演出的图像听起来过大。 (只需从磁盘读取它们,进行下采样,转换为灰度并存储在内存中-假设您有足够的内存来容纳所有东西,而您可能没有,则可能需要几个小时)。

收藏
评论

我相信,这仍然是一个研究领域。如果您有时间,可以使用一些相关的关键字:

  • 图像复制检测
  • 基于内容的图像检索
  • 图像索引
  • 图像重复删除

基本上,每个图像都经过处理(索引)以产生“图像签名”。相似的图像具有相似的签名。如果您的图像只是重新缩放,则它们的签名可能几乎相同,因此它们可以很好地聚类。一些流行的签名是MPEG-7描述符。总体而言,我认为K-Means或其任何变体可能就足够了。但是,您可能需要处理数百万个图像,这可能是一个问题。

这是主要维基百科条目的链接:
http://en.wikipedia.org/wiki/CBIR

希望这可以帮助。

收藏
评论

我最近想为PHP图像库完成此任务。我希望能够为上载的图像生成“模糊”指纹,并检查数据库中所有具有相同指纹的图像(表明它们相似),然后更紧密地比较它们以确定相似程度。

通过将上传的图像调整为150像素宽,将其缩小为灰度,将每种颜色的值四舍五入到16的最接近的倍数(给出了0至255之间的17种可能的灰色阴影),对其进行归一化并将其存储在其中,来完成此操作数组,从而创建“模糊”颜色直方图,然后创建直方图的md5sum,然后可以在数据库中进行搜索。这对于缩小与上传文件在视觉上非常相似的图像非常有效。

然后将上传的文件与数据库中的每个“相似”图像进行比较,我拍摄了两个图像,将它们调整为16x16的大小,并逐像素分析它们,并从像素中相应像素的值中减去了每个像素的RGB值。其他图像,将所有值加在一起并除以像素数即可得出平均颜色偏差。小于特定值的任何值都被确定为重复项。

整个过程都是使用GD模块以PHP编写的,与数千张图像的比较每个上传的文件仅需几百毫秒。

我的代码和方法在这里: http : //www.catpa.ws/php-duplicate-image-finder/

收藏
评论

一种非常简单的方法如下:

  • 将图像转换为内存中的灰度,因此每个像素只有0(黑色)到255(白色)之间的数字。

  • 将图像缩放到固定大小。找到合适的尺寸很重要,您应该尝试不同的尺寸。例如,您可以将每个图像缩放到64x64像素,但是无论是较小图片还是较大图片,都可能获得更好或更差的结果。

  • 为所有图像完成此操作后(是的,这将需要一段时间),请始终将两个图像加载到内存中,并将它们彼此相减。那就是减去图像A中的像素(0,0)值减去图像B中的像素(0,0)的值,现在两者都对(0,1)做相同的操作,依此类推。结果值可能为正或为负,您应始终存储绝对值(因此5表示5,-8表示8。

  • 现在,您获得了第三张图像,即图像A和B的“差异图像”(增量图像)。如果它们相同,则增量图像将全部为黑色(所有值将减为零)。黑色越少,图像的相同性就越差。您需要找到一个合适的阈值,因为即使图像实际上(在您的眼中)相同(通过缩放,更改亮度等),增量图像也不会完全是黑色的,但是只有非常深的灰阶。因此,您需要一个阈值,说明“如果平均误差(图像亮度差)低于某个值,则很有可能它们是相同的,但是如果高于该值,则它们很可能不相同。阈值就像找到正确的缩放大小一样困难,您将始终会出现误报(图像完全相同,尽管看起来完全不一样)和误报(图像完全相同,但是看起来不一样)的情况。

该算法非常慢。实际上,仅创建灰度图像需要花费大量时间。然后,您需要再次比较每张GS图像的大量时间。同时存储所有GS映像会占用大量磁盘空间。因此,即使算法如此简单,该算法也很糟糕,但结果并不算糟糕。虽然结果并不惊人,但它们比我最初想象的要好。

获得更好结果的唯一方法是使用高级图像处理,这里开始变得非常复杂。它涉及很多数学(很多数学);对于实现了这些功能的许多系统来说,都有很好的应用程序(重复查找器),因此,除非必须自己进行编程,否则最好使用以下一种解决方案。我阅读了很多有关此主题的论文,但恐怕其中大部分超出了我的视野。甚至我可能能够根据这些论文实现的算法都超出了范围;那意味着我知道需要做什么,但是我不知道它为什么起作用或实际上如何起作用,这只是魔术;-)

收藏
评论

尝试使用PerceptualDiff比较2个具有相同尺寸的图像。允许阈值,例如认为只有X个不同像素的图像在视觉上无法区分。

如果可视化副本由于缩放或文件类型不同而具有不同的尺寸,则您可能需要制作一种标准格式进行比较。例如,我可能使用ImageMagick将所有图像缩放到100x100,并将它们另存为PNG文件。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号