Dilate / erode Modify Kernel-Option

8

Ich möchte die Kontur von binarisierten Bildern glätten und denke, dass Erodieren der beste Weg ist, dies zu tun. Ich weiß, dass die normale Arbeitsweise cvDilate (src, dst, 0, iter) ist; Wobei 0 eine 3x3-Matrix ist.

Problem ist 3x3 Matrix macht eine tiefe Erodierung in meinen Bildern. Wie kann ich eine Erosion mit einer 2x2 Matrix oder etwas kleiner als die Standard 3x3 Matrix machen.

    
Jorge Vega Sánchez 01.03.2011, 12:07
quelle

6 Antworten

21

Hier haben Sie als Referenz die Ergebnisse der Verwendung verschiedener Kernel:

Saludos!

    
Dr. belisarius 01.03.2011, 13:32
quelle
3

Wenn es Ihr Ziel ist, ein binäres Bild mit glatten Kanten zu haben, dann ist es besser, wenn Sie das Original haben, etwas wie eine gaußsche Unschärfe mit cvSmooth() , bevor Sie die Binarisierung durchführen.

Das heißt, Sie sind nicht auf 3x3-Kernel beschränkt. cvDilate() benötigt ein IplConvKernel , das von CreateStructuringElementEx und Sie können mit dieser Funktion ein strukturierendes Element mit beliebiger (rechteckiger) Form erstellen. Ein strukturierendes Element arbeitet jedoch relativ zu einem Ankerpunkt, der ganzzahlige Koordinaten haben muss. Wenn Sie also eine 2x2-Matrix verwenden, kann die Matrix nicht um das Pixel zentriert werden. In den meisten Fällen ist es daher am besten, strukturierende Elemente mit einer ungeraden Anzahl von Zeilen und Spalten zu verwenden.

Was Sie tun könnten, ist ein 3x3 strukturierendes Element zu erstellen, bei dem nur der Mittelwert und die Werte direkt über, unter, links und rechts davon wie folgt sind:

%Vor%

und nicht der Standardwert:

%Vor%

Der erste Kernel sorgt für etwas glattere Kanten.

    
jilles de wit 01.03.2011 12:44
quelle
3

Hier ist ein schneller und dreckiger Ansatz, um Ihnen zu sagen, ob Erweiterung / Erosion für Sie funktioniert:

  • Reproduziere dein Bild.
  • Erodiere (diliere, öffne, schließe, was auch immer) mit dem kleinsten Filter, den du benutzen kannst (normalerweise 3x3)
  • Downsampling zurück auf die ursprüngliche Bildgröße
misha 01.03.2011 12:44
quelle
1

Mit der C-API können Sie ein dediziertes IplConvKernel -Objekt jeder Art und Größe mit der Funktion CreateStructuringElementEx() erstellen. Wenn Sie die C ++ API (Funktion dilate() ) verwenden, ist das Strukturierungselement, das für die Erweiterung verwendet wird, eine beliebige Matrix (% ​​co_de%).

    
Stéphane Péchard 01.03.2011 12:43
quelle
1

Ein Kernel mit allen Einsen ist ein Tiefpass-Faltungsfilter. Ein Dilatationsfilter ersetzt jedes Pixel in der 3X3-Region durch das dunkelste Pixel in dieser 3x3-Region. Ein Erosionsfilter ersetzt jedes Pixel in der 3X3-Region durch das hellste Pixel in dieser 3x3-Region. Das heißt, wenn Ihr Hintergrund hell ist und Ihr Vordergrundobjekt dunkel ist. Wenn Sie Hintergrund und Vordergrund spiegeln, würden Sie auch den Dilatations- und Erosionsfilter umkehren.

Auch wenn Sie eine "offene" Operation ausführen möchten, führen Sie eine Erosion gefolgt von einer Dilatation durch. Umgekehrt ist eine "nahe" Operation eine Erweiterung, gefolgt von einer Erosion. Open tendiert dazu, isolierte Klumpen von Pixeln zu entfernen und neigt dazu, Löcher zu füllen.

    
Adam Freeman 17.09.2014 18:39
quelle
0

Erodierungs- und Dilatationsmatrizen sollten ungerade sein

- eine 2 * 2-Matrix kann nicht verwendet werden

Faltungsmatrizen sollten in der Reihenfolge 1 * 1 3 * 3 5 * 5 7 * 7 ... aber ODD

sein

Versuchen Sie, "Schließen" anzuwenden - erodieren Sie dann die Bildoperation - verwenden Sie die Funktion cvMorpologyEx ()

    
Shanil Jevin 14.02.2013 18:17
quelle