Ausdünnende Konturlinien in einem binären Bild

Ich habe ein Binärbild mit Konturlinien und muss jede Konturlinie aller unnötigen Pixel reinigen und dabei eine minimal verbundene Linie hinterlassen.

Kann mir jemand eine Quelle geben, Codebeispiel oder weitere Informationen für diese Art von Problem und wo suche ich Hilfe?

4 Solutions collect form web for “Ausdünnende Konturlinien in einem binären Bild”

Wenn Sie nach Python-Implementierungen suchen, schauen Sie sich das Scikit-Image an .

Eines ihrer Beispiele ist im Wesentlichen Ihr Anwendungsfall.

Alternativ, wenn Sie wollten, um "gerade" scipy, können Sie dies tun, indem Sie aufeinander folgende Erosionen und Erweiterungen mit scipy.ndimage . (Wie @AxezDNyde erwähnt.)

Bearbeiten: Links behoben.

Es gibt tatsächlich einen Algorithmus für den sogenannten Zhang-Suen-Ausdünnungsalgorithmus. Hier finden Sie den Code: http://rosettacode.org/wiki/Zhang-Suen_thinning_algorithm

Auch habe ich eine vektorisierte Version davon in Python geschrieben, die etwa 10 mal schneller als dieser Code ist. Hier ist der Code:

 def neighbours_vec(image): return image[2:,1:-1], image[2:,2:], image[1:-1,2:], image[:-2,2:], image[:-2,1:-1], image[:-2,:-2], image[1:-1,:-2], image[2:,:-2] def transitions_vec(P2, P3, P4, P5, P6, P7, P8, P9): return ((P3-P2) > 0).astype(int) + ((P4-P3) > 0).astype(int) + \ ((P5-P4) > 0).astype(int) + ((P6-P5) > 0).astype(int) + \ ((P7-P6) > 0).astype(int) + ((P8-P7) > 0).astype(int) + \ ((P9-P8) > 0).astype(int) + ((P2-P9) > 0).astype(int) def zhangSuen_vec(image, iterations): for iter in range (1, iterations): print iter # step 1 P2,P3,P4,P5,P6,P7,P8,P9 = neighbours_vec(image) condition0 = image[1:-1,1:-1] condition4 = P4*P6*P8 condition3 = P2*P4*P6 condition2 = transitions_vec(P2, P3, P4, P5, P6, P7, P8, P9) == 1 condition1 = (2 <= P2+P3+P4+P5+P6+P7+P8+P9) * (P2+P3+P4+P5+P6+P7+P8+P9 <= 6) cond = (condition0 == 1) * (condition4 == 0) * (condition3 == 0) * (condition2 == 1) * (condition1 == 1) changing1 = numpy.where(cond == 1) image[changing1[0]+1,changing1[1]+1] = 0 # step 2 P2,P3,P4,P5,P6,P7,P8,P9 = neighbours_vec(image) condition0 = image[1:-1,1:-1] condition4 = P2*P6*P8 condition3 = P2*P4*P8 condition2 = transitions_vec(P2, P3, P4, P5, P6, P7, P8, P9) == 1 condition1 = (2 <= P2+P3+P4+P5+P6+P7+P8+P9) * (P2+P3+P4+P5+P6+P7+P8+P9 <= 6) cond = (condition0 == 1) * (condition4 == 0) * (condition3 == 0) * (condition2 == 1) * (condition1 == 1) changing2 = numpy.where(cond == 1) image[changing2[0]+1,changing2[1]+1] = 0 return image 

Eine Kombination von Erosion und Dilatation (und umgekehrt) auf einem binären Bild kann helfen, loszuwerden Salz n Pfeffer wie Rauschen verlassen kleine Linien intakt. Schlüsselwörter sind "Rangordnung Filter" und "morphologische Filter".

Es gibt ein Paket auf PyPi genannt Verdünnung , die Sie nur Pip installieren können. Es implementiert den Ausdünnungsalgorithmus von Guo und Hall für holperige Arrays / Opencv Graustufenbilder.

  • Python: Suchen / Lesen von Binärdaten
  • Zwei Komplement Binär in Python?
  • Python PIL Bytes zum Bild
  • Datei zum Lesen und Schreiben öffnen?
  • Easy_install schlägt fehl auf Fehler "Kann kein Setup-Skript finden" nach Binär-Upload?
  • Wo kann ich binäre Eier mit psycopg2 für Windows herunterladen?
  • Wie kann ich binäre Postdaten über HTTP senden?
  • Binäre Phase Shift Keying in Python
  • Wie kann ich feststellen, ob eine Datei binär ist (non-text) in python?
  • HTTP-POST-Binärdateien mit Python: prägnante Non-Pycurl-Beispiele?
  • Eine effiziente Möglichkeit, Daten aus einer großen Binärdatei zu lesen?
  • Python ist die beste Programmiersprache der Welt.