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.
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.
Hier ist ein schneller und dreckiger Ansatz, um Ihnen zu sagen, ob Erweiterung / Erosion für Sie funktioniert:
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%).
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.
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
seinVersuchen Sie, "Schließen" anzuwenden - erodieren Sie dann die Bildoperation - verwenden Sie die Funktion cvMorpologyEx ()
Tags und Links opencv image-processing computer-vision