ImageMagick按背景颜色分割图像

时间:2015-11-10 18:19:25

标签: imagemagick

我有大图https://buildyourboard.pro/userboards/board-img/data/clipart.png

如何通过透明(或其他)背景将此图像细分为小图像?

图片不在网格中,因此代码应该找到图片中每张图片的位置

1 个答案:

答案 0 :(得分:2)

如果您运行此命令,它会将所有像素加入到只有一个像素宽且具有图像原始高度的图像中。然后,您将看到所有包含单词none的行对应于您可以在图像上绘制水平线而不与任何纸板背景相交的所有位置:

convert boards.png -resize 1x! txt: | more
# ImageMagick pixel enumeration: 1,4667,255,srgba
0,0: (0,0,0,0)  #00000000  none
0,1: (0,0,0,0)  #00000000  none
0,2: (0,0,0,0)  #00000000  none
...
...
...
0,547: (0,0,0,0)  #00000000  none
0,548: (0,0,0,0)  #00000000  none
0,549: (0,0,0,0)  #00000000  none
0,550: (0,0,0,0)  #00000000  none
0,551: (0,0,0,0)  #00000000  none
0,552: (0,0,0,0)  #00000000  none
0,553: (0,0,0,0)  #00000000  none
0,554: (0,0,0,0)  #00000000  none
0,555: (39038,36633,35446,0)  #988F8A00  srgba(152,143,138,0)
0,556: (38889,36248,34984,12)  #978D8800  srgba(151,141,136,0.000183108)
0,557: (38348,35253,33873,75)  #95898400  srgba(149,137,132,0.00114443)
0,558: (35061,31775,30664,98)  #887C7700  srgba(136,124,119,0.00149538)
0,559: (33894,30508,29428,164)  #84777301  srgba(132,119,115,0.00250248)
0,560: (34379,30968,29853,243)  #86787401  srgba(134,120,116,0.00370794)

现在你可以看到第一个地方从水平线上没有任何东西到第555行。所以基本上,你想要检测它从none变为什么。

通过这样的awk即可轻松完成:

convert boards.png -resize 1x! txt: | awk 'inside && /none/{inside=0;print;next} !inside && ! /none/{inside=1;print}'
# ImageMagick pixel enumeration: 1,4667,255,srgba
0,0: (0,0,0,0)  #00000000  none
0,555: (39038,36633,35446,0)  #988F8A00  srgba(152,143,138,0)
0,911: (0,0,0,0)  #00000000  none
0,1082: (36701,34188,35001,0)  #8F858800  srgba(143,133,136,0)
0,1433: (0,0,0,0)  #00000000  none
0,1570: (33489,32153,32838,4)  #827D8000  srgba(130,125,128,6.10361e-05)
0,1937: (0,0,0,0)  #00000000  none
0,2135: (29884,28945,29339,4)  #74717200  srgba(116,113,114,6.10361e-05)
0,2486: (0,0,0,0)  #00000000  none
0,2621: (28668,27300,25241,5)  #706A6200  srgba(112,106,98,7.62951e-05)
0,2972: (0,0,0,0)  #00000000  none
0,3216: (35066,32529,28581,2)  #887F6F00  srgba(136,127,111,3.0518e-05)
0,3612: (0,0,0,0)  #00000000  none

所以,现在我们知道我们可以在第555,911,1082,1433行等处对图片进行横向切割。

我会像这样绘制前3行:

convert boards.png -stroke red -draw "line 0,555 12000,555" -draw "line 0,911 12000,911" -draw "line 0,1082 12000,1082" result.jpg

enter image description here

现在,你沿着这些方向切入 - 像这样:

convert boards.png -crop x911+0+0 row1.jpg

enter image description here

convert boards.png -crop x416+911+1082 row2.jpg

enter image description here

然后在垂直方向上应用完全相同的过程,将-resize 1x!替换为-resize x1!