用高度imagemagick替换区域的颜色

时间:2018-10-22 20:03:00

标签: image-processing imagemagick image-manipulation

使用命令“转换”,我知道如何替换具有坐标和大小的区域的颜色,但是是否可以替换图像中所有高度为40像素的区域?谢谢

这是输入图像的示例,其中有4个高度为40像素的绿色矩形。

Input.png

这将是输出,如果可能的话,将这四个绿色矩形替换为黑色,而不知道其高度,而不知道其坐标。

Out.png

2 个答案:

答案 0 :(得分:2)

我将尽力帮助Mark完成工作。我将ImageMagick和一些Unix代码与Imagemagick的Connected Components Label(连接的组件)一起使用,如下所示。

以下是图像中所有颜色的简单连接组件结果:

convert in-1.png \
-define connected-components:verbose=true \
-connected-components 4 \
null:

Objects (id: bounding-box centroid area mean-color):
  0: 256x256+0+0 133.6,134.1 50820 srgb(255,255,255)
  1: 86x40+23+30 65.5,49.5 3440 srgb(0,127,70)
  6: 60x40+42+126 71.5,145.5 2400 srgb(0,127,70)
  4: 86x27+22+80 64.5,93.0 2322 srgb(0,38,255)
  5: 86x27+121+121 163.5,134.0 2322 srgb(0,127,70)
  2: 37x40+127+59 145.0,78.5 1480 srgb(0,127,70)
  3: 36x40+177+59 194.5,78.5 1440 srgb(0,127,70)
  7: 41x32+89+186 109.0,201.5 1312 srgb(255,106,0)


请注意,您的所有绿色(即srgb(0,127,70))的高度都不会超过40。所有高度均为40,一个高度为27。为演示,让所有框都大于30。

对于上面的代码,我首先选择所有绿色对象,删除前导空格,提取边界框(即字段2),然后将x更改为+。

然后,我遍历每个边界框并提取ht以及左上角的xx和yy值。我在htval = 30上测试了ht,如果通过了,我就用黑色填充绿色。

htval=30
convert in-1.png in-1_result.png
bboxArr=(`convert in-1.png \
-define connected-components:verbose=true \
-connected-components 4 \
null: | grep "srgb(0,127,70)" | sed 's/^[ ]*//' | cut -d\  -f2 | tr "x" "+"`)
num=${#bboxArr[*]}
for ((i=0; i<num; i++)); do
ht=`echo ${bboxArr[$i]} | cut -d+ -f2`
xx=`echo ${bboxArr[$i]} | cut -d+ -f3`
yy=`echo ${bboxArr[$i]} | cut -d+ -f4`
if [ $ht -gt $htval ]; then
convert in-1_result.png -fill black -draw "color $xx,$yy floodfill" -alpha off in-1_result.png
fi
done


enter image description here

请注意上面的行

null: | grep "srgb(0,127,70)" | sed 's/^[ ]*//' | cut -d\  -f2 | tr "x" "+"`)


可以替换为

null: | awk '/srgb\(0,127,70\)/ && sub(/x/, "+") {print $2}'

添加:

这是使用awk进行所有过滤并将输出保存为颜色x,y泛洪的更紧凑的方法。然后只需一个绘制命令即可进行处理。

convert in-1.png in-1_result.png
floodfill_arr=(`convert in-1.png \
-define connected-components:verbose=true \
-connected-components 4 \
null: | awk '/srgb\(0,127,70\)/ && sub(/[x]/, "+") && split($2, arr, "+") {if (arr[4]>30) {print " color " arr[3] "," arr[4] " floodfill"}}'`)
echo "${floofill_arr[*]}"

color 42,126 floodfill color 121,121 floodfill color 127,59 floodfill color 177,59 floodfill

convert in-1_result.png -fill black -draw "${floodfill_arr[*]}" -alpha off in-1_result.png


awk首先找到所有绿色的行,然后用x替换任何+,然后使用字段分隔符+将字段$ 2拆分为数组(arr)部分,然后测试第4个arr字段(ht)大于30,如果大于30,则为通过测试的每个边界框输出-draw命令。

答案 1 :(得分:1)

您可以使用 ImageMagick “连接组件分析:”来查找图像中的所有斑点,如下所示:

return

示例输出

app.intent(DO_MY_THING, conv => {
  console.log("DO_MY_THING");
  return axios
    .get("example.com")
    .then(res => {
      console.log("res", res);
      conv.close("Did the thing");
    })
   .catch(err => {
     console.log("err", err);
     conv.close("didnt do the thing");
   });
});

有一个标题行告诉您所有字段是什么,然后发现每个斑点一行。请忽略第一条非标题行,因为它是白色背景-请参阅最后一个字段为convert blobs.png -define connected-components:verbose=true -connected-components 4 null:

看倒数第二行,它的宽为36像素,高为40像素,平均颜色为Objects (id: bounding-box centroid area mean-color): 0: 256x256+0+0 133.6,134.1 50820 srgb(255,255,255) 1: 86x40+23+30 65.5,49.5 3440 srgb(0,127,70) 6: 60x40+42+126 71.5,145.5 2400 srgb(0,127,70) 4: 86x27+22+80 64.5,93.0 2322 srgb(0,38,255) 5: 86x27+121+121 163.5,134.0 2322 srgb(0,127,70) 2: 37x40+127+59 145.0,78.5 1480 srgb(0,127,70) 3: 36x40+177+59 194.5,78.5 1440 srgb(0,127,70) 7: 41x32+89+186 109.0,201.5 1312 srgb(255,106,0) 。我想这是您要填充或更改颜色的斑点。

如果要查找40像素高的斑点,请像这样通过srgb(255,255,255)传递斑点:

srgb(0,127,70)

您将获得所有40高的blob:

grep

如果您看不到如何完成,明天我会添加更多内容-现在已经晚了。