ImageMagick –沿着内部非透明对象边界分割透明图像

时间:2018-09-05 14:17:17

标签: imagemagick transparency crop

我有一个透明的图像,其中包含三个不透明的对象,每个对象均由透明分隔。图片中是否有一个简单的命令(没有一个包含成千上万的选项,参数和随机怪胎的命令)将其分解为三个部分,每个部分都包含在一个图片文件中。

请访问this link以查看照片的种类。

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

如果所需的3个组件始终位于同一位置,则可以根据坐标进行提取:

convert image.png -crop 164x146+27+0 +repage result-0.png
convert image.png -crop 12x146+0+0   +repage result-1.png
convert image.png -crop 30x7+138+151 +repage result-2.png

enter image description here

enter image description here

最后一个是空的!


如果它们并不总是位于同一位置,那么我将查看图像的alpha /透明层:

convert image.png -alpha extract alpha.png

enter image description here

因为它显示了您想要的白色斑点,所以我会使用“连接组件分析”

查找白色斑点
convert image.png -alpha extract                  \
  -define connected-components:verbose=true       \
  -define connected-components:area-threshold=200 \
  -connected-components 4 -normalize result.png

输出

Objects (id: bounding-box centroid area mean-color):
2: 164x146+27+0 108.5,72.5 23944 srgb(255,255,255)
3: 32x161+174+0 196.5,87.0 2670 srgb(2,2,2)
5: 174x15+0+146 79.8,152.8 2370 srgb(1,1,1)
1: 15x146+12+0 19.0,72.5 2190 srgb(2,2,2)
0: 12x146+0+0 5.5,72.5 1752 srgb(255,255,255)
39: 30x7+138+151 152.5,154.0 210 srgb(255,255,255)

这向我们显示了图像中的所有斑点。回头看一下alpha层,您只需要白色的,而您想要行中的第二个字段,因为这会告诉您在哪里裁剪该blob。

这导致我们这样做:

#!/bin/bash

# Edit this according to your input image name
image="image.png"

i=0
convert "$image" -alpha extract                    \
   -define connected-components:verbose=true       \
   -define connected-components:area-threshold=200 \
   -connected-components 4 -normalize result.png | 
      awk '/255,255,255/{print $2}'              | 
         while read c ; do
            convert "$image" -crop "$c" +repage result-$i.png
            ((i=i+1))
         done

希望可以满足您的要求。

答案 1 :(得分:1)

如果在类似Unix的系统上,则可以尝试使用ImageMagick的multicrop2 bash脚本。这是一个与Mark Setchell的代码示例非常相似的脚本,其中添加了一些修饰。

输入:

enter image description here

multicrop2 -b none -f 1 -u 3 image.png results.png


它将提取每个对象,例如Mark的-connected-components用法,我的脚本也使用该对象。 -b none告诉脚本背景颜色是透明的。 -f 1表示使用1%的模糊值将背景与对象分开。 -u 3表示结果图像不会旋转。

结果:

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

如果您不关心字母,可以这样做

multicrop2 -b none -f 1 -u 3 -d 100 test.png results2.png


-d 100丢弃任何包含少于100个连续像素的区域。因此,您将只获得上面显示的前3张图像。

http://www.fmwconcepts.com/imagemagick/index.php上查看我的脚本