2016-06-09 7 views
-1

Ich suche nach einer Möglichkeit, Striche in handgezeichneten Skizzen zu finden. Mein aktueller Ansatz ist das adaptive Thresholding und findContours von OpenCV. Das Problem ist, dass findContours mir die rechte Seite und die linke Seite, die obere und untere Kontur eines einzelnen Striches gibt. Gibt es eine Möglichkeit, nur eine Konturdarstellung aus einem handgezeichneten Strich abzuleiten?Linienerkennung in Skizzen

Vielen Dank im Voraus

Edited:

Hier ist der Code und ein Bild von dem, was ich bisher erreicht habe:

Zuerst habe ich adaptive Schwellwertbildung auf das Anfangsbild angewandt:

Imgproc.GaussianBlur(image, image, new Size(5, 5), 3); 
Mat thresholded = Mat.zeros(image.size(), CvType.CV_8U); 

Dann habe ich findCountours auf das Schwellenwertbild und zusätzlich approxPolyDB auf jeder Kontur angewendet.

Imgproc.findContours(thresholded, contours, hierarchy, Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE, new Point(0,0)); 

List<MatOfPoint> refinedContours = new ArrayList<MatOfPoint>(); 
for (int i = 0; i < contours.size(); i++) { 
    MatOfPoint2f approx = new MatOfPoint2f(); 
    Imgproc.approxPolyDP(mop2mop2f(contours.get(i)), approx, 6, true); 
} 

Danach splitter ich jede Kontur an Punkten, wo der Winkel größer als eine feste Schwelle ist. Als letzten Schritt löschte ich alle Konturen, die nicht länger als eine bestimmte Schwelle sind.

In the picture you can see the thresholded image as the final contours

Mein Ziel ist parallel Konturen in einer Art und Weise zu verhindern, dass es nur eine Kontur für einen Hub im skizzierte Bild ist.

Dank

+6

Könnten Sie Ihren Code und ein Beispielbild hinterlassen? – Berriel

Antwort

0

A Kontur Sucher verwendet Konturen zu finden. Das macht nur Sinn, wenn Sie an Konturen eines Körpers mit einer gewissen Dicke interessiert sind. Sie interessieren sich für Linien. Wenn Sie einen Konturfinder auf eine dicke Linie anwenden, erhalten Sie zwei Linien anstelle einer Linie, die Ihnen noch mehr Daten zur Verfügung stellt.

Ich schlage vor, Sie versuchen stattdessen einen Ausdünnungsalgorithmus. Binarisieren Sie Ihr Bild mit einem geeigneten Schwellenwert, und wenden Sie dann einen Ausdünnungs-/Skelettierungsalgorithmus an.

Sie können das morphologische Schließen verwenden, um vor dem Ausdünnen auf Wunsch kleine Lücken zu füllen.

Verwenden Sie Schnittalgorithmen, um Ihr Skelett zu säubern.

Lesen Sie dazu: http://homepages.inf.ed.ac.uk/rbf/HIPR2/thin.htm

+0

Vielen Dank für Ihre Antwort. Ich habe eine Art Ausdünnung implementiert und es funktioniert wie ein Zauber, aber haben Sie eine Idee, wie Sie eine Darstellung der ausgedünnten Linien wie findCountours für Konturlinien abrufen können? – mapeza

+0

Wenn Sie den Punktvektor meinen, den findContours zurückgibt, verwenden Sie einfach die Linien Pixel als Koordinaten. Wenn du deine Linie richtig ausgedünnt hast, wird sie eine Dicke von 1 haben, also ist es ziemlich geradlinig. Natürlich gibt es unzählige mathematische Möglichkeiten, Merkmale solcher Strukturen zu extrahieren, wenn Sie das meinen. – Piglet

Verwandte Themen