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.

  • Wie lese ich Bits aus einer Datei?
  • Wie kann ich feststellen, ob eine Datei binär ist (non-text) in python?
  • Wie kann ich Binärdaten effizient in eine Datei in Python packen?
  • Holen Sie sich den ROI von zwei Binärbildern und finden Sie den Unterschied der mittleren Bild-Intesitäten zwischen 2 ROI in Python
  • Binärdaten mit pyserialer (python serieller Port)
  • Python OpenCV konvertiert Bild zu Byte String?
  • Wie konvertiert 'binary string' in normale Zeichenfolge in Python3?
  • Binäre Phase Shift Keying in Python
  • Easy_install schlägt fehl auf Fehler "Kann kein Setup-Skript finden" nach Binär-Upload?
  • Zwei Komplement Binär in Python?
  • Python-Einfügen und Abrufen von Binärdaten in mysql
  • Python ist die beste Programmiersprache der Welt.