7

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

我想

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

示例伪代码

for each image in poorQualityImages:
    search ./macComputer for a higherQualityImage of image
    copy higherQualityImage to ./higherQualityImages

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


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

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


更新

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

在我的脑海中,没有什么是开箱即用的。

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

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

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


更新

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

4

4 回答 4

3

您正在寻找的是所谓的图像散列 。在这个答案中,您将找到对该概念的基本解释,以及即插即用应用程序的转到 github 存储库。

哈希的基本概念

从回购页面第二个图显示了完全不同的图像之间的距离。虽然散列不是为处理旋转图像而设计的,但请注意轻微的旋转通常仍然落在阈值范围内,因此通常可以匹配为相同的。然而,这个散列的真正优势在于与我们的 mvp 树索引结构一起使用。由于它比 dct 哈希更具描述性(长度为 72 字节,而 dct 哈希为 8 字节),因此为图像查询检索到的错误匹配要少得多。" 由于它比 dct 哈希更具描述性(长度为 72 字节,而 dct 哈希为 8 字节),因此为图像查询检索到的错误匹配要少得多。" 由于它比 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

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

于 2020-05-20T08:58:59.257 回答
1

前提

我将把我的答案集中在图像处理部分,因为我相信实现细节(例如遍历文件系统)不是您问题的核心。此外,以下只是我的拙见,我相信有更好的方法来检索我不知道的图像。无论如何,我同意你的教授所说的话,我会遵循同样的思路,所以我会分享一些关于你可能使用的相似性索引的想法。

回答

  • MSE 和 SSIM - 这是一个可能的解决方案,正如您的教授所建议的那样。由于我假设低质量图像的分辨率也与好图像不同,因此请记住对好的图像进行下采样(而不是对坏图像进行上采样)。
  • 图像减法(1 范数距离) - 减去两个图像-> 如果它们相等,您将获得黑色图像。如果它们略有不同,则可以将非黑色像素(或像素强度之和)用作相似度指标。这实际上是 1 范数距离。
  • 直方图距离- 可以参考这篇论文:https ://www.cse.huji.ac.il/~werman/Papers/ECCV2010.pdf 。比较两个图像的直方图可能对您的任务具有潜在的鲁棒性。也看看这个问题:比较两个直方图
  • 嵌入学习- 我看到您将 tensorflow、keras 或 pytorch 作为标签,让我们考虑深度学习。我想到了这篇论文:https ://arxiv.org/pdf/1503.03832.pdf这个想法是学习从图像空间到欧几里得空间的映射——即计算图像的嵌入。在嵌入超空间中,图像是点。本文通过最小化三元组损失来学习嵌入函数。三元组损失旨在最大化不同类图像之间的距离,并最小化同一类图像之间的距离。您可以在像 ImageNet 这样的数据集上训练相同的模型。您可以通过降低图像质量来扩充数据集,以使模型对图像质量的差异“不变”(例如,下采样后上采样、图像压缩、添加噪声等)。一旦可以计算嵌入,就可以计算欧几里得距离(作为 MSE 的替代品)。这可能比使用 MSE/SSIM 作为相似性指标更好。FaceNet 的回购:https ://github.com/timesler/facenet-pytorch 。另一种可能对您有所帮助的通用方法(与面部无关):https ://github.com/zegami/image-similarity-clustering 。
  • 用于预测相似度分数的连体网络——我指的是这篇关于人脸验证的论文:http: //bmvc2018.org/contents/papers/0410.pdf。siamese 网络将两张图像作为输入,并在 [0, 1] 中输出一个值。我们可以将输出解释为两个图像属于同一类的概率。您可以训练这种模型来预测以下类型的图像对 1:(优质图像,人为降级的图像)。为了降低图像质量,您可以将下采样和上采样、图像压缩、添加噪声等结合起来。让模型预测不同类别的图像对(例如不同的图像)为 0。网络的输出可以用作相似性指标。

备注 1

这些不同的方法也可以结合起来。它们都为您提供相似性指数,因此您可以很容易地平均结果。

备注 2

如果您只需要这样做一次,那么您在实施和训练深度模型方面所付出的努力可能是不合理的。我不建议这样做。不过,如果您找不到任何其他解决方案,并且 Mac 确实充满图像并且无法手动搜索,您可以考虑使用它。

于 2020-05-16T21:10:48.187 回答
0

如果您查看文档,imgdupes您将看到有以下选项:

--dry-run

试运行(不要删除任何文件)

因此,如果您运行imgdupes--dry-run您将获得所有重复图像的列表,但实际上不会删除任何内容。您应该能够处理该输出以根据需要移动图像。

于 2020-05-26T10:18:38.307 回答
0

尝试我为解决此问题而开发的类似图像查找器。那里有解释和算法,因此您可以根据需要实现自己的版本。

于 2020-09-08T22:05:05.177 回答