在PHP或Python中目视检查图像是否重复和损坏


Visually check for image duplicates and corrupted images in PHP or Python

我希望在这里找到一些关于图像处理的帮助。

我不熟悉Python,虽然我熟悉PHP。虽然我听说Python在图像比较、调整大小等方面"更好"。

现在,我想创建一个程序,将图像与MySQL数据库进行比较以便找到相似的图像。如果相似性高于一定数量(百分比?),它将被标记为可能的重复。

除此之外,我还想创建一个程序(它将在重复检查之前运行),检查图像是否损坏/不完整。

我浏览了StackOverflow,但只找到了2008/2009年的答案,我认为现在可能有一种更有效或更有效的做事方式。

感谢您花时间阅读本文,如果您碰巧回复我的问题,请提前感谢。:)

编辑:我注意到eyeBuy SDK是如何"将边缘检测、颜色、强度和对比度信息组合成一个字符串"的。这是一个很好的解决方案,我的重复图像检测?

试图在不同的光线、角度和视角下找到相似的照片需要大量的算法,我认为这在你的情况下是不必要的。没有简单的方法可以做到这一点

然而,如果你有不同的图像,你调整了大小或修改了一点,那么提到的脚本Artjom Kurapov将非常有助于你。如果您的数据库也包含重复项,我会先进行MD5比较,然后再尝试其他操作。

您应该使用一个简单的数据库来计算md5哈希,记录到数据库中并在数据库中搜索匹配项,否则对于每个文件,您必须遍历整个数据库,这将大大增加处理时间。

如果您不想处理每个文件的整个图像数据库,您还需要从脚本中创建某种序列化,以便保存记录。

如上所述,一个能够处理不同视角的算法将非常困难。这是许多(学术)研究的焦点。

作为一个简单的开始,您可以看看Python phash。

一个简单的基于DCT的算法,对噪声和规模有合理的弹性,可以做到以下几点:

  1. 将图像转换为灰度
  2. 将图像缩小到缩略图大小,例如[32x32]
  3. 运行二维离散余弦变换
  4. 保留左上[8 x 8],最重要的低频分量
  5. 基于组件的符号对块进行二进制化
  6. 结果是64位散列

这个主题的变体是

  1. 将图像转换为灰度
  2. 可选择将大小重新调整为预定义大小
  3. 将图像划分为固定数量的块
  4. 确定全局平均值
  5. 确定每个区块的局部平均值
  6. 对于散列,每个块写一个1或0,如果局部平均值大于或小于全局平均值,则挂起