当前位置:  开发笔记 > 编程语言 > 正文

删除重复的图像

如何解决《删除重复的图像》经验,为你挑选了4个好方法。

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

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



1> Pawz Lion..:

我最近想完成PHP图像库的这个任务.我希望能够为上传的图像生成"模糊"指纹,并检查数据库中是否有任何具有相同指纹的图像,表明它们是相似的,然后更仔细地比较它们以确定它们的相似程度.

我通过将上传的图像调整为150像素宽,将其缩小为灰度,将每种颜色的值四舍五入到最接近的16的倍数(在0到255之间给出17种可能的灰度阴影)来实现它,将它们标准化并将它们存储在一个数组,从而创建一个"模糊"颜色直方图,然后创建一个md5sum的直方图,然后我可以在我的数据库中搜索.这在缩小与上传文件非常直观相似的图像方面非常有效.

然后将上传的文件与数据库中的每个"相似"图像进行比较,我拍摄了两张图像,将它们调整为16x16,然后逐像素地分析它们,并将每个像素的RGB值远离相应像素的值.其他图像,将所有值加在一起并除以像素数,给出平均颜色偏差.任何低于特定值的东西都被确定为重复.

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

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



2> Liam..:

尝试使用PerceptualDiff比较具有相同尺寸的2个图像.允许诸如考虑仅具有X个不同像素的图像的阈值在视觉上不可区分.

如果由于缩放或不同的文件类型,可视副本可能具有不同的维度,您可能需要制作标准格式进行比较.例如,我可能会使用ImageMagick将所有图像缩放到100x100并将它们保存为PNG文件.



3> Mecki..:

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

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

将图像缩放到固定大小.找到合适的尺寸很重要,你应该玩不同的尺码.例如,您可以将每个图像缩放到64x64像素,但使用更小或更大的图片可能会得到更好或更差的结果.

一旦你为所有图像完成了这个(是的,这需要一段时间),总是在内存中加载两个图像并相互减去它们.即将图像A中的像素(0,0)的值减去图像B中的像素(0,0)的值,现在对两者中的(0,1)执行相同的操作,依此类推.结果值可能是正数或负数,您应该始终存储绝对值(因此5结果为5,-8但结果为8).

现在您有第三个图像是图像A和B的"差异图像"(增量图像).如果它们相同,则增量图像全部为黑色(所有值将减去零)."黑色越少",图像越不相同.你需要找到一个好的阈值,因为即使图像实际上是相同的(对你的眼睛),通过缩放,改变亮度等,增量图像将不是完全黑色,但它将只有非常暗的灰色.因此,您需要一个阈值,表示"如果平均误差(增量图像亮度)低于某个值,那么它们仍然很可能是相同的,但是如果它高于该值,则很可能不是.找到正确的阈值与找到正确的缩放尺寸一样难.你总会有误报(图像被认为是相同的,

这个算法超慢.实际上只创建灰度图像需要花费大量时间.然后你需要将每个GS图像相互比较一次,大量的时间.存储所有GS映像也需要大量磁盘空间.所以这个算法非常糟糕,但结果并不差,即使它那么简单.虽然结果并不令人惊讶,但它们比我原先想象的要好.

获得更好结果的唯一方法是使用高级图像处理,这里开始变得非常复杂.它涉及很多数学(很多数学); 对于许多已实现这些功能的系统,有很好的应用程序(重复查找程序),因此除非您必须自己编程,否则最好使用其中一种解决方案.我读了很多关于这个主题的论文,但我担心这大部分超出了我的视野.即使是我可以根据这些论文实现的算法也超出了它; 这意味着我明白需要做什么,但我不知道它为什么会起作用或它是如何工作的,这只是魔术;-)



4> user25967..:

我实际上写了一个应用程序来做这件事.

我开始使用先前的应用程序,该应用程序使用基本的Levenshtein距离算法来计算图像相似性,但出于多种原因,该方法是不合需要的.毫无疑问,您将要找到的用于确定图像相似性的最快算法是均方误差或平均绝对误差(两者都具有O(n)的运行时间,其中n是图像中像素的数量,并且以多种不同方式对任一算法的实现进行线程化也是微不足道的.Mecki的帖子实际上只是一个平均绝对错误实现,我的应用程序可以执行(如果您愿意,代码也可用于您的浏览乐趣).

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

肯定有比MSE/MAE更好的算法(事实上,应用于视觉信息的这两种算法的问题已被充分记录),如SSIM,但它需要付出代价.其他人试图比较图像中的其他视觉质量,例如亮度,对比度,颜色直方图等,但与简单地测量误差信号相比,它们都是昂贵的.

我的应用程序可以正常工作,这取决于有多少图像是在这些文件夹中.它是多线程的(我已经看到它完全加载了八个处理器核心进行比较),但我从未测试过大于几百个图像的图像数据库.几百张图像听起来非常大.(简单地从磁盘读取它们,下采样,转换为灰度级并存储在内存中 - 假设你有足够的内存来容纳所有内容,你可能没有 - 可能需要几个小时).

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有