9

Ich möchte die Konturen eines Bildes extrahieren, ausgedrückt als eine Folge von Punktkoordinaten.Extrahieren Sie einzelne Linienkonturen von Canny Kanten

Mit Canny bin ich in der Lage, ein Binärbild zu erzeugen, das nur die Kanten des Bildes enthält. Dann versuche ich findContours zu verwenden, um die Konturen zu extrahieren. Die Ergebnisse sind jedoch nicht OK.

Für jede Kante bekam ich oft 2 Zeilen, als wäre es eine sehr dünne Fläche. Ich möchte meine Konturen vereinfachen, damit ich sie als einzelne Linien zeichnen kann. Oder extrahieren Sie sie vielleicht mit einer anderen Funktion, die direkt das richtige Ergebnis liefert, wäre sogar noch besser.

Ich habe mir die Dokumentation von OpenCV angesehen, aber ich konnte nichts Nützliches finden, aber ich vermute, dass ich nicht der Erste mit einem ähnlichen Problem bin. Gibt es irgendeine Funktion oder Methode, die ich verwenden könnte?

Hier ist der Python Code, den ich bisher geschrieben habe:

def main(): 
    img = cv2.imread("lena-mono.png", 0) 

    if img is None: 
     raise Exception("Error while loading the image") 

    canny_img = cv2.Canny(img, 80, 150) 

    contours, hierarchy = cv2.findContours(canny_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) 
    contours_img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) 

    scale = 10 
    contours_img = cv2.resize(contours_img, (0, 0), fx=scale, fy=scale) 

    for cnt in contours: 
     color = np.random.randint(0, 255, (3)).tolist() 
     cv2.drawContours(contours_img,[cnt*scale], 0, color, 1) 

    cv2.imwrite("canny.png", canny_img) 
    cv2.imwrite("contours.png", contours_img) 

Der Skalierungsfaktor verwendet, um die doppelten Linien der Konturen zu markieren. Hier sind die Links zu den Bildern:

  • Lena Graustufen-
  • Edges extrahiert mit Canny
  • Contours: 10-fach Zoom, wo Sie die falsch Ergebnisse produziert von findContours

sehen Irgendwelche Vorschlag wird sehr geschätzt werden.

+1

sollten Sie HoughLines http://docs.opencv.org/modules/imgproc/doc/feature_detection.html#houghlines – Khashayar

+0

verwischen Sie das Bild, um Geräusche zu reduzieren – baci

+0

Ich glaube nicht, dass es eine Frage von Rauschen in th ist Das Bild. Wenn Sie die mit Canny extrahierten Kanten sehen, sind sie in Ordnung. Mit HoughLines wäre ich nicht in der Lage, gekrümmte Linien im Bild zu behandeln, nicht wahr? – Muffo

Antwort

6

Wenn ich Sie recht verstehe, Ihre Frage hat nichts mit der Suche nach Zeilen in einem parametrischen (Hough-Transformation) Sinn zu tun.

Es ist eher ein Problem mit der findContours Methode, die mehrere Konturen für eine einzelne Linie zurückgibt.

Dies liegt daran, ein Canny Kante Detektor - das bedeutet, es Filter auf die Bildintensitätsgradienten abgestimmt ist, die auf beiden Seiten einer Linie auftritt.

So Ihre Frage ist eher an: „Wie kann ich Low-Level-Kantenmerkmale zu einzelnen Zeile umwandeln?“, Oder vielleicht: „Wie kann ich die Konturen Hierarchie navigieren einzelne Linien zu erkennen“

Diese ein recht häufiges Thema ist - und hier ist eine vorherige Stelle, die eine Lösung vorgeschlagen:

OpenCV converting Canny edges to contours