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

时间:2011-12-09 12:57:01

标签: python scripting machine-learning matching

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

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

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,14x6)。我需要匹配的是前100个左右的像素,显然我无法匹配整个图像。我考虑过复制和裁剪图像并将裁剪与参考图像匹配,但这似乎不太理想。

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:2)

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

  1. 将扫描仪盖子的普通图像加载到ndarray
  2. 将每张照片/图片加载到ndarray中。
  3. 比较两者的重要部分并指定分数。
  4. 如果分数高于您的门槛......
  5. 如果性能问题,可以通过使用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
    

    当然,在实际应用中,您应该测量像素值之间的差异,因为强度和色​​彩平衡可能会因扫描而发生变化等等......但是,我认为它不需要很多时间提出一些可用于你工作的东西。

    HTH!