ImageMagick和分割透明背景图像中的连续岛

时间:2019-05-23 08:43:49

标签: imagemagick

我正在尝试将看起来像这样的东西转换为一堆较小的图像裁切或“切片”,其中每个切片可能与另一个重叠,但应包含每个不透明像素的岛。长连续笔画不必进行转换,但是大多数“斑点”应该被转换。

enter image description here

如此有效,我试图自动对其进行“切片”以使其看起来像这样(粗略的手动切片):

enter image description here

如何使用imagemagick自动裁剪此类图像的元素,并还返回裁剪每个子图像的位置,宽度/高度?

2 个答案:

答案 0 :(得分:1)

您可以使用“连接组件分析” 。由于您的图像不包含透明度,因此很难使用,因此我对其进行了修改,并大致将棋盘区域设置为透明,如下所示:

enter image description here

然后按照以下步骤进行操作:

magick image.png  -alpha off -colorspace gray -negate -threshold 10%  \
   -define connected-components:verbose=true                          \
   -define connected-components:area-threshold=100                    \
   -connected-components 8 -auto-level output.png

示例输出

Objects (id: bounding-box centroid area mean-color):
  1: 498x614+0+0 236.9,317.2 219166 srgb(0,0,0)
  2: 112x583+112+0 177.0,268.6 16094 srgb(255,255,255)
  27: 128x210+350+342 403.8,436.5 14195 srgb(255,255,255)
  7: 104x148+338+85 390.0,160.4 10451 srgb(255,255,255)       <--- this one
  3: 103x145+200+0 250.9,70.9 10317 srgb(255,255,255)
  25: 107x132+202+245 252.7,307.8 9227 srgb(255,255,255)
  36: 117x139+213+428 268.3,497.2 9103 srgb(255,255,255)
  12: 139x77+0+112 62.1,152.4 7162 srgb(255,255,255)
  16: 73x93+414+161 459.0,213.4 4104 srgb(255,255,255)
  37: 51x61+249+457 274.6,488.1 2224 srgb(0,0,0)
  4: 71x36+338+0 382.0,19.6 1507 srgb(255,255,255)
  26: 32x47+238+277 253.1,300.2 875 srgb(0,0,0)
  43: 50x30+283+584 310.7,600.0 833 srgb(255,255,255)
  13: 41x17+31+140 51.0,148.1 410 srgb(0,0,0)
  9: 11x11+174+100 178.7,105.3 104 srgb(255,255,255)

每行输出对应一个斑点。开头有一个标题,告诉您每个字段是什么。

让我们看一下这行:

  7: 104x148+338+85 390.0,160.4 10451 srgb(255,255,255)

并将该斑点以半透明的红色绘制到您的图像中:

magick image.png -fill "rgba(255,0,0,0.5)" -draw "rectangle 338,85 442,243" result.png

enter image description here


请注意,我实际上已经在命令中放弃了alpha通道(使用-alpha off),并将转换为灰度的RGB通道用作要检测的项目。根据图像的创建方式,最好放弃RGB通道,而只使用alpha或其反(-alpha extract -negate)。

答案 1 :(得分:0)

不确定ImageMagick可以做到这一点。

有一个脚本可以对Gimp做类似的事情:ofn-extract-objects

它使用的技术非常简单:选择背景并将选择内容转换为“路径”(即矢量)。向量在选择区域的每个连续边框处将有一个“笔画”(这意味着,如果您有带孔的对象,则有嵌套的笔画,但这并不容易检测和过滤)。一旦有了笔触,就可以使用锚点和切线的坐标来确定它们的边界框。

如果您不想使用Gimp,则可以使用potrace并以类似方式处理输出SVG。