【问题标题】:ImageMagick split image by background colorImageMagick 按背景颜色分割图像
【发布时间】:2017-03-01 22:58:02
【问题描述】:

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

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

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

【问题讨论】:

  • 这个问题已经在这里提出并回答了:stackoverflow.com/questions/26271757/…
  • @ErickG.Hagstrom 实际上这个问题是不同的而且更简单。这个问题的图像中的元素不是在一个规则的网格上——它们不是垂直上下对齐的,所以答案要复杂得多——我认为。

标签: imagemagick


【解决方案1】:

如果您运行此命令,它会将所有像素压缩成只有一个像素宽且具有图像原始高度的图像。然后,您将看到所有带有单词 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

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

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

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

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

【讨论】:

  • 谢谢,我晚上试试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-12
  • 2017-09-04
  • 2014-12-10
  • 1970-01-01
  • 1970-01-01
  • 2021-01-02
  • 1970-01-01
相关资源
最近更新 更多