ImageMagick, начиная с версии 6.8.9-10, включает в себя опцию -connected-components
, которую можно использовать, чтобы делать то, что вы хотите, однако из примера , представленного на официальном сайте, это не сразу очевидно, как получить исходное изображение за вычетом удаленных подключенных компонентов.
Я почти уверен, что есть более простой способ, но я сделал это с помощью неуклюжего скрипта, выполнив ряд шагов:
Сначала я выполнил команду из примера подключенных компонентов:
convert in.png \
-define connected-components:verbose=true \
-connected-components 8 out.png
Это производит вывод в следующем формате:
Objects (id: bounding-box centroid area mean-color):
(...)
181: 9x9+1601+916 1605.2,920.2 44 gray(0)
185: 5x5+1266+923 1268.0,925.0 13 gray(0)
274: 5x5+2276+1661 2278.0,1663.0 13 gray(255)
Затем я использовал awk для фильтрации только строк, содержащих область (в пикселях) черных компонентов (средний цвет gray(0)
в моем изображении), меньшую моего порога $ min_cc_area. Обратите внимание, что connected-components
имеет возможность фильтровать компоненты меньше, чем заданная область, но мне нужно было наоборот. Строка awk похожа на следующую:
{if ($4 < $min_cc_area && $5=="gray(0)") { print $2 }}
Затем я приступил к созданию командной строки для ImageMagick, в которой я рисовал белые прямоугольники поверх этих подключенных компонентов. Команда -draw
ожидает координаты в форме x1,y1 x2,y2
, поэтому я снова использовал awk для вычисления координат из координат в формате [w]x[h]+x1+y1
, заданном -connected-components
:
awk '{print "white fill rectangle " $3 "," $4 " " $3+$1-1 "," $4+$2-1 }'
Наконец, я запустил созданную командную строку ImageMagick, чтобы создать новое изображение, объединяющее все белые прямоугольники поверх исходного.
В итоге я получил следующий скрипт:
# usage: $0 infile min_cc_area outfile
infile=$1
min_cc_area=$2
outfile=$3
awk_exp="{if (\$4 < $min_cc_area && \$5==\"gray(0)\") { print \$2 }}"
draw_rects=""
draw_rects+=$(convert $infile -define connected-components:verbose=true \
-connected-components 8 null: | \
awk "$awk_exp" | tr 'x+' ' ' | \
awk '{print " rectangle " $3 "," $4 " " $3+$1-1 "," $4+$2-1 }')
convert $infile -draw "fill white $draw_rects" $outfile
Обратите внимание, что это решение может стереть черные пиксели возле удаленных CC, если они вставят ограничивающий прямоугольник удаленного компонента.