在本地计算机上反向图像搜索(用于图像重复)

Sam*_*Sam 7 image-processing cbir keras tensorflow pytorch

我有一堆从 pdf 中提取的质量较差的照片。我认识的某个人在她的电脑 (Mac) 上某处有高质量的照片,但我的理解是很难找到它们。

我想要

  • 循环浏览每张质量较差的照片
  • 使用每张质量较差的照片作为查询图像并使用此人的计算机作为数据库执行反向图像搜索以搜索更高质量的图像
  • 并在一个目标文件夹中创建每个高质量图像的副本。

示例伪代码

for each image in poorQualityImages:
    search ./macComputer for a higherQualityImage of image
    copy higherQualityImage to ./higherQualityImages
Run Code Online (Sandbox Code Playgroud)

我需要执行一次此操作。我正在寻找一种工具、github 存储库或库,它可以执行此功能,而不是对基于内容的图像检索的深入理解。


reddit上有一个帖子,有人试图做类似的事情

imgdupes是一个程序,它似乎几乎实现了这一点,但我不想删除重复项,我想将最高质量的副本复制到目标文件夹


更新

给我以前的图像处理教授发了电子邮件,他给我发了这个

在我的头顶上,没有什么开箱即用的。

这里没有保证的解决方案,但您可以缩小搜索空间。您需要一个小程序来输出两个图像之间的 MSE 或 SSIM 相似度索引,然后编写另一个程序或 shell 脚本来扫描硬盘驱动器并计算硬盘驱动器上的每个图像与每个查询图像之间的 MSE,然后检查具有最高 X 百分比相似度得分的图像。

类似的东西。仍然不能保证找到你想要的一切。如果低质量图像与高质量图像的像素尺寸不同,则必须进行一些图像缩放才能获得相似度指数。如果质量差的图像具有不同的纵横比,那就更糟了。

所以我认为这并不难,但也不是微不足道的。难度部分取决于低质量图像中损坏的性质。


更新

我写的 Github 项目实现了我想要的

mrk*_*mrk 3

您正在寻找的称为图像哈希 。在这个答案中,您将找到该概念的基本解释,以及即插即用应用程序的首选 github 存储库。

哈希的基本概念

来自存储库页面:“我们开发了一种基于 Marr 小波的新图像哈希,该哈希基于边缘信息(特别是角点)计算感知哈希。研究表明,人类视觉系统特别利用某些视网膜细胞来区分类似角的刺激。人们相信这种角信息可以用来区分数字图像,从而激发了这种方法。基本上,从小波获得的边缘信息被压缩为 72 字节的固定长度散列。二进制量化允许散列之间相对快速的汉明距离计算。下面的散点图显示了我们标准图像语料库的结果。第一个图显示了每个图像与其受攻击的对应图像之间的距离(例如内部距离)。第二个图显示了图像之间的相互距离完全不同的图像。虽然哈希不是设计来处理旋转图像的,但请注意轻微的旋转通常仍然落在阈值范围内,因此通常可以匹配为相同的。然而,这个哈希的真正优点是与我们的 mvp 树索引结构一起使用。由于它比 dct 哈希更具描述性(长度为 72 字节,而 dct 哈希为 8 字节),因此图像查询检索到的错误匹配要少得多。”

另一篇需要深入阅读的博文,其中包含一个应用程序示例。

可用代码和用法

可以在此处找到 github 存储库。显然还有更多的东西有待发现。导入包后,您可以使用它来生成和比较哈希值:

>>> from PIL import Image
>>> import imagehash
>>> hash = imagehash.average_hash(Image.open('test.png'))
>>> print(hash)
d879f8f89b1bbf
>>> otherhash = imagehash.average_hash(Image.open('other.bmp'))
>>> print(otherhash)
ffff3720200ffff
>>> print(hash == otherhash)
False
>>> print(hash - otherhash)
36
Run Code Online (Sandbox Code Playgroud)

演示脚本 find_similar_images也在提到的 github 上,说明了如何在目录中查找相似图像。