我正在尝试裁剪几千张扫描图像。我正在写一个脚本,如果我可以确定源图像是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个左右的像素,显然我无法匹配整个图像。我考虑过复制和裁剪图像并将裁剪与参考图像匹配,但这似乎不太理想。
答案 0 :(得分:2)
我不知道存在一个特定的命令行工具来执行此操作,但使用numpy
编写自己的工具将非常简单。基本程序是:
ndarray
。如果性能问题,可以通过使用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!