首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于匹配图像相似部分的命令行工具

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

Stack Overflow用户
提问于 2011-12-09 20:57:01
回答 1查看 443关注 0票数 3

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

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

代码语言:javascript
复制
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个左右的像素,显然我不能匹配整个图像。我考虑过复制和裁剪图像,并将裁剪后的图像与参考图像进行匹配,但这似乎不是最优的。

EN

回答 1

Stack Overflow用户

发布于 2011-12-09 21:51:19

我不知道是否存在特定的命令行工具来完成此任务,但使用numpy编写自己的命令行工具将非常简单。基本步骤如下:

将扫描仪盖子的普通图像加载到ndarray.

  • Load中,将两张照片/图像中的重要部分加载到ndarray.

  • Compare中,并为其分配分数。如果分数高于threshold...

,则执行

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

numpy部件的概念验证实现:

代码语言:javascript
复制
>>> 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

当然,在真实的应用程序中,您可能应该测量像素值之间的差异,因为强度和颜色平衡可能会因扫描而改变,等等。然而,我认为想出一些对你的工作有用的东西并不需要太多时间。

哈!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8445808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档