Linux下使用ImageMagick裁剪并遍历非白色Polygon的方法
使用ImageMagick裁剪并遍历处理图片中的多边形(白色背景)
针对白色背景、前景为多色多边形的图片,你可以通过连通区域分析结合脚本遍历的方式,逐个裁剪并处理每个多边形,以下是具体步骤:
方法一:按连通区域(位置)分割多边形
适合处理同一颜色但分开、或不同颜色的独立多边形,按像素连通性识别每个多边形区域:
1. 查看连通区域信息
先执行命令获取所有前景多边形的边界坐标,确认每个区域的位置:
convert input.png -threshold 0 -negate -define connected-components:verbose=true -connected-components 8 null:
-threshold 0 -negate:将白色背景转为黑色,所有非白色的多边形前景转为白色,便于连通区域识别-connected-components 8:采用8连通规则(包含对角线方向),更贴合多边形的形状- 输出内容会包含每个区域的ID、边界坐标(
x,y,width,height)、面积等,过滤掉gray(0)的背景区域即可得到所有多边形信息
2. 编写脚本批量裁剪
用bash脚本遍历上述输出,自动裁剪每个多边形并保留原形状(背景透明):
#!/bin/bash # 替换为你的输入图片文件名 INPUT_IMG="input.png" # 提取前景多边形的连通区域信息,过滤背景 convert "$INPUT_IMG" -threshold 0 -negate -define connected-components:verbose=true -connected-components 8 null: | grep -v "gray(0)" | while read line; do # 提取区域坐标和ID COORDS=$(echo "$line" | awk '{print $2}') AREA_ID=$(echo "$line" | awk '{print $1}') # 裁剪区域并去除白色背景,保留多边形形状 convert "$INPUT_IMG" -crop "$COORDS" +repage \ \( +clone -transparent white -fill black -opaque none \) \ -compose CopyOpacity -composite "polygon_${AREA_ID}.png" done
-compose CopyOpacity:将裁剪区域内的白色背景转为透明,最终得到仅包含多边形的图片- 生成的文件会以
polygon_<ID>.png命名,每个文件对应一个独立多边形
方法二:按颜色分割多边形
如果需要按颜色分类处理多边形,可先提取所有前景颜色,再针对每个颜色生成掩码并裁剪:
1. 提取所有前景颜色
执行命令获取图片中所有非白色的颜色值:
convert input.png -transparent white -unique-colors txt:- | grep -v "transparent" | awk '{print $3}'
输出示例:#ff0000、#00ff00等,对应不同颜色的多边形
2. 按颜色批量裁剪
用脚本遍历每个颜色,生成对应掩码并裁剪该颜色下的所有多边形:
#!/bin/bash INPUT_IMG="input.png" # 获取所有非白色的前景颜色 COLORS=$(convert "$INPUT_IMG" -transparent white -unique-colors txt:- | grep -v "transparent" | awk '{print $3}') for COLOR in $COLORS; do # 生成当前颜色的掩码文件 COLOR_NAME=${COLOR//\#/} # 去掉#号作为文件名部分 convert "$INPUT_IMG" -fill black +opaque "$COLOR" -transparent black "mask_${COLOR_NAME}.png" # 提取该颜色下的连通区域并裁剪 convert "mask_${COLOR_NAME}.png" -define connected-components:verbose=true -connected-components 8 null: | grep -v "gray(0)" | while read line; do COORDS=$(echo "$line" | awk '{print $2}') AREA_ID=$(echo "$line" | awk '{print $1}') # 裁剪并保留多边形形状 convert "$INPUT_IMG" -crop "$COORDS" +repage \ "mask_${COLOR_NAME}.png" -crop "$COORDS" +repage \ -compose CopyOpacity -composite "polygon_${COLOR_NAME}_${AREA_ID}.png" done # 删除临时掩码文件 rm "mask_${COLOR_NAME}.png" done
注意事项
- 若图片存在抗锯齿边缘,可添加
-blur 0x1或调整-threshold参数(如-threshold 5%),避免细碎的杂色区域被误识别 - 连通规则可根据多边形形状调整:
-connected-components 4仅识别上下左右方向的连通区域,适合规则矩形;8连通更适合不规则多边形 - 脚本中的文件名、输出路径可根据实际需求修改
内容的提问来源于stack exchange,提问作者BlueConch
相关产品推荐
相关产品推荐

