ImageMagick – 沿内部非透明对象边界拆分透明图像
ImageMagick – Split Transparency Image Along Internal Non-transparent Object Borders
我有一个包含三个非透明对象的透明图像,每个对象都由透明度隔开。有没有一个简单的命令——而不是一个有无数选项、参数和随机极客在图片中走动的命令——将这张图片分解成三个部分,每个部分在一个图片文件中。
请访问this link查看图片类型
非常感谢你的帮助。
如果你想要的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
最后一个是空的!
如果它们不总是在同一个地方,我会查看图像的 alpha/transaprency 图层:
convert image.png -alpha extract alpha.png
因为它在白色上显示了你想要的位,我会寻找白色斑点,使用 "Connected Component Analysis"
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 }' |
while read c ; do
convert "$image" -crop "$c" +repage result-$i.png
((i=i+1))
done
希望它能满足您的需求。
如果在 Unix-like 系统上,您可以尝试我使用 ImageMagick 的 multicrop2 bash 脚本。这是一个与 Mark Setchell 的代码示例非常相似的脚本,只是添加了一些额外的功能。
输入:
multicrop2 -b none -f 1 -u 3 image.png results.png
它将提取每个对象,就像 Mark 对 -connected-components 的用法一样,我的脚本也使用了它。 -b none 告诉脚本背景颜色是透明的。 -f 1 表示使用 1% 的模糊值将背景与对象分开。 -u 3 表示不旋转生成的图像。
结果:
如果不在意字母,可以
multicrop2 -b none -f 1 -u 3 -d 100 test.png results2.png
-d 100 丢弃包含少于 100 个连续像素的任何区域。所以你只会得到上面显示的前 3 个图像。
查看我的脚本
我有一个包含三个非透明对象的透明图像,每个对象都由透明度隔开。有没有一个简单的命令——而不是一个有无数选项、参数和随机极客在图片中走动的命令——将这张图片分解成三个部分,每个部分在一个图片文件中。
请访问this link查看图片类型
非常感谢你的帮助。
如果你想要的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
最后一个是空的!
如果它们不总是在同一个地方,我会查看图像的 alpha/transaprency 图层:
convert image.png -alpha extract alpha.png
因为它在白色上显示了你想要的位,我会寻找白色斑点,使用 "Connected Component Analysis"
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 }' |
while read c ; do
convert "$image" -crop "$c" +repage result-$i.png
((i=i+1))
done
希望它能满足您的需求。
如果在 Unix-like 系统上,您可以尝试我使用 ImageMagick 的 multicrop2 bash 脚本。这是一个与 Mark Setchell 的代码示例非常相似的脚本,只是添加了一些额外的功能。
输入:
multicrop2 -b none -f 1 -u 3 image.png results.png
它将提取每个对象,就像 Mark 对 -connected-components 的用法一样,我的脚本也使用了它。 -b none 告诉脚本背景颜色是透明的。 -f 1 表示使用 1% 的模糊值将背景与对象分开。 -u 3 表示不旋转生成的图像。
结果:
如果不在意字母,可以
multicrop2 -b none -f 1 -u 3 -d 100 test.png results2.png
-d 100 丢弃包含少于 100 个连续像素的任何区域。所以你只会得到上面显示的前 3 个图像。