2010-12-10 3 views
1

Wenn ich ein Bild mit, sagen wir mal, Quadrate. Ist es möglich, alle Formen, die aus 10 (nicht weißen) Pixeln oder weniger bestehen, zu entfernen und alle Formen zu behalten, die aus 11 Pixeln oder mehr bestehen? Ich möchte es programmgesteuert oder mit einer Befehlszeile ausführen.Entfernen Sie Formen aus dem Bild mit X Anzahl der Pixel oder weniger

Vielen Dank im Voraus!

Antwort

2

Es gibt mehrere Möglichkeiten, dies zu erreichen. Worauf Sie sich beziehen, wird in Dokumentenimaging-Anwendungen allgemein als Fleckenentfernung bezeichnet. Dokumentenscanner verursachen beim Scannen oft eine Menge Schmutz und Rauschen in einem Bild. Daher muss dieses entfernt werden, um die OCR-Genauigkeit zu verbessern.

Ich gehe davon aus, dass Sie hier S/W-Bilder verarbeiten oder Ihr Bild in S/W konvertieren können, sonst wird es sehr viel komplexer. Despeckle wird durchgeführt, indem alle Blobs auf der Seite analysiert werden. Eine andere Möglichkeit, sich über die Größe eines Blobs zu entscheiden, besteht darin, sich für Breite, Höhe und Anzahl der kombinierten Pixel zu entscheiden.

Leptonica.com - Ist eine C-basierte Open-Source-Bibliothek, die über die erforderlichen Blobanalysefunktionen verfügt. Mit ein paar einfachen Checks und Loops können Sie diese kleineren Objekte löschen. Leptonica kann auch ganz einfach in ein Befehlszeilenprogramm kompiliert werden. Es gibt viele Beispielprogramme und das ist der beste Weg, Leptiona zu lernen.

Zum Testen können Sie ImageMagick ausprobieren. Es hat eine Befehlszeilenoption für das Entfernen von Flecken, aber es hat keine weiteren Parameter. http://www.imagemagick.org/script/command-line-options.php#despeckle

Die andere Möglichkeit ist, nach "despeckle" Algorithmen in Google zu suchen.

3

Die Füllalgorithmen nachschlagen und ändern, um die Pixel zu zählen anstatt zu füllen. Wenn die Form klein genug ist, fülle sie mit Weiß.

0

Sie möchten einen Beschriftungsalgorithmus für verbundene Komponenten. Es wird durch das Bild scannen und jeder verbundenen Form eine ID-Nummer geben, sowie jedem Pixel eine ID-Nummer zuweisen, zu welcher Form es gehört.

Nachdem Sie einen Filter für verbundene Komponenten ausgeführt haben, zählen Sie einfach die jedem Objekt zugewiesenen Pixel, suchen Sie nach Objekten mit weniger als 10 Pixel und ersetzen Sie die Pixel in diesen Objekten durch Weiß.

3

Möglicherweise ist ein Algorithmus namens Erosion nützlich. Es arbeitet mit booleschen Bildern, wobei alle Bereiche von "true" verkleinert werden, indem eine Ebene ihrer Oberflächenpixel entfernt wird. Bewerben Sie sich ein paar Mal, und kleine Bereiche verschwinden, größere bleiben (obwohl geschrumpft). Dekomprimieren Sie die Überlebenden mit dem entgegengesetzten Algorithmus Dilatation (Erosion auf das logische Komplement des Bildes anwenden). Suchen Sie nach Möglichkeiten, boolesche Bilder zu definieren, indem Sie testen, ob sich ein Pixel in einem "Objekt" befindet, wie Sie es definieren, und wie Sie die Ergebnisse auf das ursprüngliche Bild anwenden, um die unerwünschten kleinen Objekte in die Hintergrundfarbe zu ändern.

Um genauer zu sein, müssten Beispiele gesehen werden.

+0

Ist die Erosion -> Dilatationszyklus verlustfrei? –

0

Sie wollen nur die Fläche der einzelnen Komponenten herausfinden. Ein 8-Richtungs-Tracking-Algorithmus könnte also helfen. Ich habe eine API, um dieses in C++ codierte Problem zu lösen. Wenn Sie möchten, senden Sie mir eine E-Mail.

1

Wenn Sie openCV verwenden können, macht dieses Stück Code, was Sie wollen (z. B. despakle). Sie können w/Parameter der Größe (3,3) in der ersten Zeile spielen, um größere oder kleinere Rauschartefakte zu entfernen.

Mat element = getStructuringElement(MORPH_ELLIPSE, Size(3,3)); 
morphologyEx(image, image, MORPH_OPEN, element); 
morphologyEx(image, image, MORPH_CLOSE, element); 
0

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.

Verwandte Themen