【问题标题】:find coordinates of small partially-transparent image within a large image在大图像中查找小部分透明图像的坐标
【发布时间】:2017-01-22 21:10:04
【问题描述】:

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

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

所描述的corner images 可能看起来像这样(请忽略蓝色数字,因为它们只是 cmets。我想使用具有透明度的灰色 PNG 图形):

1左上角
2左下角
3右下角
4右上角

这些corner images被放置在大图内的特定位置:

每组corner icons 都定义了一个“感兴趣的区域”(不过,如何确定多个左上角中的哪一个属于哪个区域将是另一个问题)。

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

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

我可以使用什么工具和过程来获得如此小的图像在大图像中的绝对 x 和 y 位置?

【问题讨论】:

  • 请提供一些示例图片,以便我们了解您的意思。
  • @Mark:是的,确实,我的问题有望通过您在回答另一个问题时提到的方法来解决。我会尝试并回到这里。
  • @Mark:图片显示了我正在操作的图像类型。它们是手绘图,因此看起来不像医学图像。为了保持角落图像相同,我从自制图标库中复制/粘贴它们。
  • 好的,我明白了。我有一些问题...您是否已经标记了图像,或者您打算在有方法时标记它们?图像和角标记是 JPG 还是 PNG 文件?角落是否曾经旋转过?是否可以通过信息图像中未出现的某种独特颜色的存在来检测角落 - 因为这样会更快?什么是透明度问题 - 你能否澄清一下 - 图像/角落已经是半透明的还是你想让它们变成那样?

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


【解决方案1】:

在图像中查找形状非常困难,并且可能需要很长时间,因为您最终会尝试匹配大图像的每个像素位置的形状,并且涉及许多乘法和比较。相比之下,查找颜色相对简单,因此我建议您考虑使用饱和颜色编码的标记,并且由于您的绘图是手工绘制的,因此它们不太可能出现在您的绘图中。

所以,可能是这样的(左上角tl.png、右上角tr.png、左下角bl.png和右下角br.png):

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

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

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

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

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

如果你有这样的图片:

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

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 秒:

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

附:我用这个画了一张大图:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-17
    • 2016-08-30
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多