python - 用于匹配图像相似部分的命令行工具

标签 python scripting machine-learning matching

我有几千张要裁剪的扫描图像。我正在编写一个脚本,如果我可以确定源图像是来自未裁剪边框(扫描仪盖)的 3x5 图片还是 4x6 图片,该脚本将相应地裁剪图片。

我找到了命令行工具来比较和匹配整个图像(使用 imagemagick convert),但不是图像的指定区域:

convert img1.jpg  "img2.jpg" -compose difference -composite -colorspace gray miff:- | identify -verbose - | sed -n '/^.*mean: */{s//scale=2;/;s/(.*)//;s/$/*100\/32768/;p;q;}' | bc

(如果结果 < .10 通常是匹配,但它是 cpu 密集型的)

是否有工具或 Python 图像库可以让我匹配比较两幅图像中的某些区域,看看它们是否匹配?未裁剪区域不是纯白色,如下面的示例图像 (1 3x5、1 4x6) 所示。我只需要匹配前 100 个左右的像素,显然我无法匹配整个图像。我考虑过复制和裁剪图像并将裁剪图像与引用图像匹配,但这似乎不太理想。

enter image description here

enter image description here

最佳答案

我不知道是否存在特定的命令行工具来执行此操作,但使用 numpy 编写自己的工具会非常简单.基本程序是:

  1. 将扫描仪盖子的普通图像加载到 ndarray 中。
  2. 在 ndarray 中加载每张照片/图像。
  3. 比较两者的重要部分并打分。
  4. 如果分数高于您的阈值...

如果性能有问题,可以通过使用 seek() 移动文件并仅读取文件的一部分来加快速度来优化步骤 #2。

numpy 部分的概念验证实现:

>>> import numpy as np
>>> scanner_lid = np.ones((5, 5))
>>> scanner_lid
array([[ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.]])
>>> photo = np.random.randint(0, 2, (5, 5))
>>> photo
array([[0, 0, 1, 1, 0],
       [0, 1, 1, 1, 0],
       [0, 0, 1, 1, 1],
       [1, 1, 0, 0, 1],
       [1, 0, 1, 1, 1]])
>>> matching_pixels = scanner_lid[0:2, 0:2] == photo[0:2, 0:2]  #compare the top-left 4 pixels
>>> matching_pixels
array([[False, False],
       [False,  True]], dtype=bool)
>>> np.sum(matching_pixels)
1

当然,在现实世界的应用程序中,您可能应该测量像素值之间的差异,因为强度和色​​彩平衡可能会随着扫描的不同而发生变化,等等……但是,我认为这不会需要很多时间想出一些对你的工作有用的东西。

喂!

关于python - 用于匹配图像相似部分的命令行工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8445808/

相关文章:

python - 为什么 Python 扩展输出 [[...]]

linux - 如何在shell脚本中创建服务器?

python - 使用 STDOUT 作为 openvpn auth-user-pass 的输入

python - 后验高斯过程(Python)

python - 我可以使方法成为生成器而不是返回生成器吗?

python - 测试 post API 接收状态代码 200 而不是 201

python - 如果我在之后立即关闭应用程序,Gtk 不会将文本保存到剪贴板

linux脚本简单算术代码

python - 使用 Pandas DataFrame 列的 Sklearn GridSearchCV

machine-learning - 选择权重初始化之间的初始损失(迭代=0)有很大不同。为什么?