2016-07-27 18 views
1

Ich habe ein Bild mit fast konstanten Linien darin und ich benutze Algorythm mit morphologischen Operationen, um sie aus dem Bild zu löschen. Die Sache ist, dass morphologisches Öffnen oder Schließen die Linien mit den Kanten des Bildes verschmilzt, anstatt nur die Nachbarkonturen zu schmelzen. Ich brauche nur Nachbarkonturen, die mit morphologischen Operationen verschmolzen sind, und um zu vermeiden, dass diese Linie mit der Kante verschmilzt, weil ich später nicht in der Lage bin, den verschmolzenen Linienfrieden aus dem Bild zu entfernen. Das Problem bleibt auch dann bestehen, wenn ich das Bild invertiere und morphe. Operationen (Bildpixel schwarz zu weiß, weiß zu schwarz, und statt zu öffnen, verwende ich schließen).Morphologische Operationen verschmelzen Linien mit Kanten von Bildern

Wie zu stoppen?

Ich benutze diese Operation Nachbar Konturen zu fusionieren:

Mat morphKernelClose = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new org.opencv.core.Size(25, 25)); 
Imgproc.morphologyEx(src, src, Imgproc.MORPH_CLOSE, morphKernelClose); 

Einfach Canny Bild:

enter image description here

Bild nach MORPH_CLOSE mit:

enter image description here

Dieser Fehler ermöglicht es mir nicht, die Zeilen vollständig zu löschen (diese zusammengeführten Teile sind übrig), indem Sie eine zweite Morphologieoperation verwenden, die der zuerst verwendeten entgegengesetzt ist.

+1

Die C++ - Version von morphologyEx verfügt über Parameter für den Umgang mit dem Rahmen. Nicht sicher, ob sie auch in der Java (?) Version existieren. – Micka

+0

Danke.Es gibt eine Funktionsüberladung in Java: 'public static void MorphologieEx (Mat src, Mat dst, int op, Mat kernel, Point anchor, int iterations, int borderType, Scalar borderValue)', wobei "** borderType - Pixel extrapolation method. Siehe "borderInterpolate" für Details. ** "und" ** borderValue - Rahmenwert bei einem konstanten Rahmen. Der Standardwert hat eine spezielle Bedeutung. Siehe "createMorphologyFilter" für Details. ** "Diese Funktion Überlastung erlaubt mir die Verschmelzung mit Grenzen mit geeigneten Argumenten zu manipulieren? Ich kann keine Quellen finden, die den Gebrauch davon benutzen und erklären. –

+0

Ich denke ja. Probier es einfach. Setzen Sie es auf border_constant und Wert auf 0. – Micka

Antwort

1

Dank FiReTiTi und Micka mir geholfen, diese zu lösen. Ich habe Mickas Vorschlag benutzt.

Ich habe die dritte Funktion von morphologyEx, die die Grenzen zu manipulieren verwendet. Der Code in der Frage gegeben ist mit dieser Fassung:

Mat morphKernelClose = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new org.opencv.core.Size(25, 25)); 
Point anchor = new Point(morphKernelClose.size().width/2, morphKernelClose.size().height/2); 
Imgproc.morphologyEx(src, src, Imgproc.MORPH_CLOSE, morphKernelClose, anchor, 1, Core.BORDER_CONSTANT, new Scalar(0,0,0)); 

Hier ist das Ergebnis: enter image description here

Diese Methode kann schnell und einfach sein, aber nicht perfekt, weil es schneidet nur die Pixel nahe den Grenzen.

Wenn Sie irgendwelche Vorschläge haben, wie man das verbessert, poste es in den Kommentaren!

+1

Die Randeffekte sind immer ein Schmerz und sehr schwer zu vermeiden. In Ihrem Fall wäre die einzige Lösung, die ich sehen würde, jede Zeile vor der Verarbeitung zu erweitern, aber es würde bedeuten, sie alle zuerst zu finden, auch ihre Ausrichtung, und sie schließlich zu erweitern. Ich denke nicht, dass es das wert ist. – FiReTiTi

2

Die einfachste Lösung wäre es, die Bildgröße zu erhöhen, die zusätzliche Kontur mit schwarz füllen, und führen Sie dann die Operationen:

  1. erstellen ein größeres Bild, komplett schwarz.
  2. Kopieren Sie Ihr Bild in der Mitte des neuen Bildes.
  3. Führen Sie die Operationen
  4. Löschen Sie die Grenze hinzugefügt (Kopieren Sie die Mitte des Bildes in eine neue).
+1

statt Back-Copying könnte ein Unterbild verwendet werden. – Micka