在大图像中找到小的部分透明图像的坐标

时间:2017-01-22 21:10:05

标签: python image compare imagemagick command-line-interface

我正在寻找一种以编程方式(不使用任何图形用户界面)查找大图像中小图像坐标的方法。

我的目标是在更大的信息图像中找到小corner images的坐标。使用这些坐标,我想确定特定的“感兴趣区域”,以便在呈现图像或从图像中剪切这些区域时,我能够专注于这些区域。

所描述的corner images可能看起来像这些(请忽略蓝色数字,因为它们只是注释。我想使用透明的灰色PNG图形):
enter image description here
1左上角
2左下角左侧 3右下角
4右上角

这些corner images被放置在大图像中的某些位置:
enter image description here
每组corner icons定义一个“感兴趣的区域”(如何确定多个左上角中的哪一个属于哪个区域将成为另一个问题)。

我想将一个免费/开源库与命令行操作或Python接口一起使用。似乎ImageMagick库看起来非常接近可能的解决方案。但是如果解决了这个问题,任何其他技术都可以。

例如ImageMagick库我想按顺序检查四个corner items(它们只是相同原始图像的90度旋转),并将它们与大图像“比较”。在大图像中,corner items很可能与其他图形内容“非常接近”。因此,简单的逐块身份测试可能会失败。 “透明度”应被视为“不关心”。

我可以使用哪种工具和流程将这么小的图像的绝对x和y位置放在一个较大的位置?

1 个答案:

答案 0 :(得分:1)

在图像中查找形状非常困难并且可能需要相当长的时间,因为您最终会尝试匹配大图像的每个像素位置的形状,并且需要进行多次乘法和比较。相比之下,找到一种颜色相对简单,所以我建议您考虑使用饱和的颜色编码标记,并且,如图所示,它们很可能不会出现在图纸中。

所以,这些行可能是(左上角tl.png,右上角tr.png,左下角bl.png和右下角br.png):< / p>

convert -size 24x24 xc:none -background grey -gravity northwest -splice 1x1 -fill magenta -draw "point 0,0" tl.png

enter image description here

convert -size 24x24 xc:none -background grey -gravity northeast -splice 1x1 -fill cyan -draw "point 24,0" tr.png

enter image description here

convert -size 24x24 xc:none -background grey -gravity southeast -splice 1x1 -fill yellow -draw "point 24,24" br.png

enter image description here

convert -size 24x24 xc:none -background grey -gravity southwest -splice 1x1 -fill blue -draw "point 0,24" bl.png

enter image description here

希望您可以在每个角落看到青色,品红色,黄色和蓝色标记,并保留之前的灰色视觉效果。他们在这里被炸毁了:

enter image description here

然后,如果您有这样的图像:

enter image description here

您可以通过以下方式轻松找到角落:

convert z.png txt: | grep -E "cyan|magenta|yellow|blue"

<强>输出

11,11: (65535,0,65535)  #FFFF0000FFFF  magenta
380,11: (0,65535,65535)  #0000FFFFFFFF  cyan
11,180: (0,0,65535)  #00000000FFFF  blue
380,180: (65535,65535,0)  #FFFFFFFF0000  yellow
11,201: (65535,0,65535)  #FFFF0000FFFF  magenta
355,201: (0,65535,65535)  #0000FFFFFFFF  cyan
11,365: (0,0,65535)  #00000000FFFF  blue
355,365: (65535,65535,0)  #FFFFFFFF0000  yellow

为了增加图像中未出现的标记的确定性,您可以在青少年,品红色,黄色角落像素旁边添加第二种不太可能的颜色,以确保找到一个标记 - 例如红色和绿色然后你图像中自然发生的几率是无穷小的。

如果您想比较形状匹配方法,可以将我的tl.png(左上角)展平为白色背景:

convert tl.png -background white -flatten x.png

并像这样进行子图像搜索:

compare  -metric RMSE -subimage-search z.png x.png locations.png
2208.73 (0.0337031) @ 11,11

您将看到它需要11秒并生成这两个图像:

enter image description here

enter image description here

显示找到匹配的位置以及匹配的确定百分比。

P.S。我用这张照片做了大局:

convert -size 600x400 xc:white -draw "image over 10,10 35,35 'tl.png'" -draw "image over 355,10 25,25 'tr.png'" -draw "image over 10,155 25,25 'bl.png'" -draw "image over 355,155 25,25 'br.png'" -draw "image over 10,200 35,35 'tl.png'" -draw "image over 330,200 25,25 'tr.png'" -draw "image over 10,340 25,25 'bl.png'" -draw "image over 330,340 25,25 'br.png'" -bordercolor black -border 1 z.png