我有一个透明的图像,其中包含三个不透明的对象,每个对象均由透明分隔。图片中是否有一个简单的命令(没有一个包含成千上万的选项,参数和随机怪胎的命令)将其分解为三个部分,每个部分都包含在一个图片文件中。
请访问this link以查看照片的种类。
非常感谢您的帮助。
答案 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
最后一个是空的!
如果它们并不总是位于同一位置,那么我将查看图像的alpha /透明层:
convert image.png -alpha extract alpha.png
因为它显示了您想要的白色斑点,所以我会使用“连接组件分析”
查找白色斑点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的代码示例非常相似的脚本,其中添加了一些修饰。
输入:
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张图像。