ImageMagick, начиная с версии 6.8.9-10, включает в себя опцию -connected-components
, которую можно использовать, чтобы делать то, что вы хотите, однако из example, представленной на официальном веб-сайте, сразу не видно, как получить первоначальное изображение за вычетом удаленных подключенных компонентов.
Я почти уверен, что есть более простой способ, но я сделал это с помощью неуклюжего сценария выполнения ряда этапов:
Первого, я запустил команду от подключенного примера компонентов:
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
Заметьте, что это решение может привести к удалению черных точек вблизи удален КК, если они insersect ограничительного прямоугольника удаляемого компонента.
Является ли эрозия -> циклом дилатации без потерь? – 2010-12-13 19:43:14