2017-01-02 1 views
0

Ich möchte die Konturen einer Fortsetzung Bereich, aber ohne sehr enge Stellen in der Ausgabe.Find kontinuierliche Bereich ohne enge Engpässe mit OpenCV

kann das Eingangsbild wie dieses Bild aussehen (nach den Schwellenwert Anwendung): Input image

Mit nur OpenCVS findContours Methode aufrufen, I Ergebnis erhalten folgende: Actual output

Mein Problem ist, dass ich nicht will die schmalen (weißen) Spitzen im Ergebnis haben. Nur das Bild zu verwischen funktioniert nicht, weil ich die schwarzen Spitzen nicht einschließen darf. Also sollte die gewünschte Ausgabe wie diese grüne Linie aussehen: Ideal output

Ist es möglich, die OpenCV (findContours) eine minimale "Dicke" der Fläche zu sagen?

+0

Warum Sie nicht verwenden [morphologische Operationen] (http://docs.opencv.org/trunk/d9/d61/tutorial_py_morphological_ops.html) zu diese loswerden? –

Antwort

1

Erosion kann das Hinzufügen der Randpixel auf dem Hintergrund betrachtet werden. So wird es solche schmalen Stücke in Ihrer Eingabe los. Da es jedoch alle Grenzen verzerrt, müssen Sie danach dilation anwenden, um den Effekt der Erosion auf die tatsächliche Grenze rückgängig zu machen. Der Erosions- + Dilatationsprozess wird opening genannt.

Der folgende Codeteil erzeugt die gewünschte Ausgabe. Spielen Sie mit k_size entsprechend Ihrer Bildgröße. Dann wenden Sie findContours an.

# Read and binarize the image 
image = cv2.imread("test.png",cv2.IMREAD_GRAYSCALE) 
ret, im_th =cv2.threshold(image,150,255,cv2.THRESH_BINARY) 

# Set the kernel and perform opening 
k_size = 7 
kernel = np.ones((k_size,k_size),np.uint8) 
opened = cv2.morphologyEx(im_th, cv2.MORPH_OPEN, kernel) 
cv2.imwrite("opened.png", opened) 

Der Ausgang:

Opened output with no islands

+0

Danke, Ihre Lösung funktioniert perfekt! – wessnerj

0

Verwenden Sie Erosion, gefolgt von Dilatation mit einem kleinen Kernel, bevor Sie findContours tun. Es ist eine besondere Art von Operator in OpenCV die genau das tut, genannt Opening mit morphologyEx

So etwas wie dies funktionieren sollte:

morphologyEx(src, dst, MORPH_OPEN, Mat()); 
Verwandte Themen