在 Linux 上查找与给定图像视觉相似的图像

软件推荐 linux 图片 搜索 计算机视觉
2021-10-24 23:40:10

我正在寻找一种工具/软件,它将以图像为例并扫描我的硬盘驱动器以找到与之相似的图像,就像 Google 图片在网络上所做的那样。

必须在 Linux 上运行。请参阅为 Windows 软件查找给定图像文件(在 Windows 上)的视觉相似图像。

4个回答

findimagedupes是 Linux 和其他 Unix 平台上常用的命令行程序。

它寻找所有文件之间的相似性。如果您愿意,您可以过滤输出以仅保留有关一个文件的信息,我认为这不会对性能产生巨大影响(缓慢的部分是扫描所有文件)。

要扫描某个目录下的 PNG 和 JPEG 文件,并且只保留类似于 SOMEIMAGE.jpg 的图像,请运行以下命令:

cd /path/to/directory
find . \( -name '*.jpg' -o -name '*.png' \) -print0 |
findimagedupes -0 - |
grep -F 'SOMEIMAGE.jpg'

如果您要经常这样做,findimagedupes 可以将图像指纹存储在数据库中,这样一旦建立数据库,搜索速度就会大大加快。有关详细信息,请参阅手册。

有点 DIY,但你可以用python加上OpenCVNumpy来做这种事情——在任何一种情况下,方法都是一样的:

  • 通过以下方式生成您正在搜索的图像的指纹:
    • 减少到灰度
    • 调整为固定大小,例如 64x64
    • 可能生成强度的直方图
  • 使用 os.walk 查找要测试的文件
  • 生成可能匹配的指纹
  • 比较指纹,例如 xor 指纹并计算 1 以衡量它们的差异程度。
  • 如果您愿意,可以添加一个 GUI。

    1. 任何操作系统,包括 Windows、Linux、OS-X、Raspberry Pi、超级计算机。
    2. 免费 - 价格和 FOSS
    3. GUI - 大量可用的 GUI 库
    4. 网上很多例子只是谷歌。
    5. 一次学习经历——你可以把它算作加分或减分

我建议geeqie,您可以通过包管理器安装,例如sudo apt install geeqie.

在此处输入图像描述

如您所见,即使图像完全不同,它也可以按皮卡丘的耳朵进行分组。请注意,此目录有约 3759 张图像,需要约 5 分钟才能完成。

如何使用:

  1. cd到所需的目录。或者,您可以geeqie先打开并稍后插入路径。
  2. 键入geeqie以打开当前目录图像。
  3. ctrl+A突出显示左侧面板中的所有图像。
  4. 右键单击以打开上下文菜单。
  5. 选择“查找重复项..”菜单项
  6. 选择“低”相似度。等待右下角进度条完成。如果您在自定义阈值字段中键入但不刷新页面,您可能需要重新选择“自定义”相似度。
  7. 单击“缩略图”按钮查看缩略图(如果没有显示,请重新单击)
  8. 右键单击单个项目并在主窗口中选择“查看”或“在新窗口中查看”。
  9. 只有相似的图像组可见,其余的将保持隐藏。
  10. 然后,您可以勾选右下角的“比较两个文件集”复选框,将要比较的图像文件从文件管理器拖放到右侧面板中,它将在左侧面板上显示相似的图像(来自第一个文件集)。该错误是相似度级别似乎在这里效果不佳,只能显示完全相同而不是低相似度。

[更新]

我刚刚写了一个python 脚本(不相关geeqie)来做到这一点。该脚本具有强大的选项,可让您选择哈希方法或曼哈顿范数方法,将匹配/不匹配输出保存为特定目录的符号链接,缓存文件(您可以在几秒钟内比较 10000 多张图像!),并指定可接受的百分比。目前我只让它在 Linux 中工作。

注意:这不再起作用。我无法再让它为大多数文件运行,看来这个工具已经坏了。

Libpuzzle,它将进行比较部分,但不是搜索所有图像部分。要安装它,请使用 package libpuzzle-bin,它将为您提供命令行工具。

它是一个库和命令行工具,旨在比较两个图像并列出它们的相似性。不久前,我用它来查找非常相似(徽标)的文件,效果很好。

如果你想使用它,你必须使用调用 libpuzzle 的附加软件和适当的选项。

我编写了一个可用于 find -exec 命令的脚本。脚本是这样的(我把它放在一个名为 的文件中simple-pd.sh):

#!/bin/bash
if (( $(echo "0.80<`puzzle-diff \"$1\" \"$2\"`" | bc -l) )) ; then
   exit 0
fi
exit 1

它是这样调用的:

find . -regex ".*jpg\|.*gif\|.*png" -exec ./simple-pd.sh MYIMAGE {} \; -print

将 MYIMAGE 替换为要进行比较的图像。脚本需要可执行权限 ( chmod +x simple-pd.sh)

该工具(连同此处的脚本)将在大多数情况下执行您想要的操作。

虽然我确实喜欢这个工具,但它也有它的缺点。它无法读取所有文件(我有时会遇到 jpgs 的问题)并且在失败时很烦人。

的参数puzzle-diff几乎没有记录,您将需要测试一些您想要拥有的图像和一些您不需要的图像,以查看哪些图像最适合您的任务。

我的脚本假定将非常相似 (0.80) 的图像报告为“是”,其余的为“否”。您可能希望减少该数字以满足您的需求。