Entfernen lange horizontale/vertikale Linien vom Rand Bild mit OpenCV
Wie kann ich ein standard-image-processing-Filter (von OpenCV) zu entfernen, lange horizontale und vertikale Linien, die aus einem Bild?
Den Bildern sind die B&W so entfernen bedeutet einfach nur malen schwarz.
Illustration:
Ich bin derzeit dabei, die es in Python, zu iterieren über die pixel-Zeilen und Spalten und zu erkennen reicht von aufeinander folgenden Pixeln, entfernen diejenigen, die länger sind als N Pixel. Aber, es ist wirklich sehr langsam im Vergleich zu der OpenCV-Bibliothek, und wenn es einen Weg gibt, erreichen das gleiche mit OpenCV-Funktionen, die wahrscheinlich um Größenordnungen schneller.
Ich mir vorstellen, dies kann durch Faltung mit einem Kern, der eine Reihe von Pixeln (horizontale Linien), aber ich habe eine harte Zeit, herauszufinden, den genauen Vorgang, würde den trick tun.
- Nur schnelles denken hier. Warum kommst du nicht mit Hough-Line-Detektion zu finden, Linien und tun, was Sie wollen über die Zeilen, die Sie ausgewählt?
- Yep war über post die gleiche Sache betrachten, docs und der Theorie, wenn nötig.
- Es scheint, die Rückkehr lange Liniensegmente aufgeteilt in viele kleine Bilder, die Ruinen der Fähigkeit heraus zu filtern, die nicht ausreichend lange... keine Ahnung, warum das passieren würde?
Du musst angemeldet sein, um einen Kommentar abzugeben.
wenn deine Zeilen sind wirklich horizontal/vertikal, versuchen Sie, diese
Ergebnis
Finden Sie OpenCV Morphologische Transformationen - Dokumentation für weitere details.
Mat linek=Mat::zeros(Size(11,11),CV_8UC1);linek.row(5)=255;
linek[...,5]=1
im Grunde die Schaffung eines+
geformt kernelWie lange ist "lange". Lange, wie die Linien, die die Länge des gesamten Bildes oder nur mehr als
n
Pixel?Wenn letzteres, dann könnte man verwenden Sie einfach einen
n+1
Xn+1
median oder Modus-filter, und legen Sie die Ecke Koeffizienten zu null, und Sie würden den gewünschten Effekt.Wenn Sie sich beziehen, nur Linien, die die Breite des gesamten Bildes, benutzen Sie einfach die
memcmp()
- Funktion gegen eine Reihe von Daten, und vergleichen Sie es mit einem pre-allokierten array von Nullen, die die gleiche Länge wie eine Zeile. Wenn Sie gleich sind, Sie wissen, Sie haben eine leere Zeile, die sich über die horizontale Länge des Bildes, und die Zeile kann gelöscht werden.Dies ist VIEL schneller als die element-Weise Vergleiche, die Sie derzeit verwenden, und ist sehr gut erklärt hier:
Warum ist memcpy() und memmove() schneller als Zeiger-Schritten?
Wenn Sie möchten, wiederholen Sie den gleichen Vorgang für die vertikalen Linien, nur die Umsetzung der Bild, und wiederholen Sie den Vorgang.
Ich weiß, das ist eher eine system-Optimierungs-level-Ansatz als ein openCV filter wie von Ihnen gewünscht, aber es bekommt den job zu erledigen schnell und sicher. Sie beschleunigen kann die Berechnung sogar noch mehr, wenn Sie zu verwalten, zu zwingen, die Bild und Ihre leeren array als array von 32-bit-aligned im Speicher.
Entfernen Sie Horizontale Linien, die aus einem Bild Sie können ein edge-detection Algorithmus zur Erkennung von Kanten und verwenden Sie dann Hough-Transformation in OpenCV zu erkennen, die Linien und die Farbe, die Sie weiß:
Dies ist für javacv.
Paket com.test11;
Anderen.