ImageMagick, à partir de la version 6.8.9-10, inclut une option -connected-components
qui peut être utilisée pour faire ce que vous voulez, cependant à partir du example fourni dans le site officiel, il n'est pas immédiatement évident comment obtenir réellement l'image originale moins les composants connectés enlevés.
Je suis presque sûr qu'il ya un ce chemin, mais plus simple j'ai fait via un script clunky effectuant une série d'étapes:
D'abord, je courais la commande de l'exemple des composants connectés:
convert in.png \
-define connected-components:verbose=true \
-connected-components 8 out.png
Ce produit sortie dans le format suivant:
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)
Ensuite, j'ai utilisé awk pour filtrer uniquement les lignes contenant une zone (en pixels) de composantes noires (couleur moyenne gray(0)
dans mon image) plus petite que mon seuil $ min_cc_area. Notez que connected-components
a une option pour filtrer les composants plus petits qu'une zone donnée, mais j'avais besoin de l'opposé. La ligne awk est similaire à ce qui suit:
{if ($4 < $min_cc_area && $5=="gray(0)") { print $2 }}
J'ai alors de créer une ligne de commande pour ImageMagick où je dessinais des rectangles blancs sur le dessus de ces composants connectés. La commande -draw
attend les coordonnées sous la forme x1,y1 x2,y2
, donc j'utiliser awk à nouveau pour calculer les coordonnées de celles dans le format [w]x[h]+x1+y1
donné par -connected-components
:
awk '{print "white fill rectangle " $3 "," $4 " " $3+$1-1 "," $4+$2-1 }'
Enfin, j'ai couru la ligne de commande ImageMagick créée pour créer une nouvelle image combinant tous les rectangles blancs au-dessus de l'original.
En fin de compte, je me suis le script suivant:
# 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
Notez que cette solution peut effacer des pixels noirs près de la CC enlevé, si elles insersect le rectangle de délimitation de l'élément retiré.
Le cycle d'érosion -> dilatation est-il sans perte? –