ImageMagick, ab Version 6.8.9-10, enthält eine -connected-components
Option, die verwendet werden kann, um zu tun, was Sie wollen, aber von der example auf der offiziellen Website zur Verfügung gestellt wird, ist es nicht sofort offensichtlich, wie das Originalbild tatsächlich erhalten, abzüglich der entfernten verbundenen Komponenten.
ich fast sicher bin, es ein einfacherer Weg ist, aber ich habe es über einen klobigen Skript eine Reihe von Schritten ausführen:
Zuerst lief ich den Befehl aus dem angeschlossenen Komponente Beispiel:
convert in.png \
-define connected-components:verbose=true \
-connected-components 8 out.png
Dies erzeugt eine Ausgabe in dem folgenden Format:
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)
Dann habe ich awk verwendet, um nur die Zeilen zu filtern, die einen Bereich (in Pixeln) von schwarzen Komponenten (Mittelwertfarbe gray(0)
in meinem Bild) enthalten, der kleiner ist als meine Schwelle $ min_cc_area. Beachten Sie, dass connected-components
eine Option zum Filtern von Komponenten hat, die kleiner als ein bestimmter Bereich sind, aber ich benötigte das Gegenteil. Die awk Linie ist ähnlich der folgenden:
{if ($4 < $min_cc_area && $5=="gray(0)") { print $2 }}
Ich fuhr fort, um dann eine Befehlszeile für ImageMagick zu schaffen, wo ich weiße Rechtecke auf dieser verbundenen Komponenten zog. Der -draw
Befehl erwartet Koordinaten in Form x1,y1 x2,y2
, so habe ich awk wieder die Koordinaten von den in dem Format [w]x[h]+x1+y1
durch -connected-components
gegeben zu berechnen:
awk '{print "white fill rectangle " $3 "," $4 " " $3+$1-1 "," $4+$2-1 }'
Schließlich lief ich die erstellte ImageMagick Befehlszeilen zu erstellen ein neues Bild, das alle weißen Rechtecke über dem Original kombiniert.
Am Ende habe ich das folgende Skript:
# 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
Beachten Sie, dass diese Lösung schwarze Pixel in der Nähe des entfernt CC löschen kann, wenn sie insersect das Begrenzungsrechteck der entfernten Komponente.
Ist die Erosion -> Dilatationszyklus verlustfrei? –