Für die Segmentierung eines Bildes sucht man sich eine Stelle des Bildes, die beschrieben ist, das heißt wo der Wert über einem Grenzwert liegt. Dann vergrößert man den Rahmen um diesen Punkt immer weiter, bis man einen Rahmen hat, der komplett unter diesem Grenzwert liegt. Das ist dann ein Zeichen.
import numpy as np from scipy import misc import matplotlib.pyplot as plt def filtern(bild, zeile, spalte, eps): spalten=[spalte] # speichert die Spalten in einer Liste zeilen= [zeile] # speichert die Zeilen in einer Liste while(True): summeZeilenmax=0 summeZeilenmin=0 summeSpaltenmax=0 summeSpaltenmin=0 for l in zeilen: # Überprüft für alle Zeilen, ob sie beim Maximum/Minimum der Spalten unter dem Grenzwert liegen if (bild[l, max(spalten)]-eps <= 0): summeZeilenmax +=1 if (bild[l, min(spalten)]-eps <= 0): summeZeilenmin +=1 for k in spalten: # Überprüft für alle Spalten, ob sie beim Maximum/Minimum der Zeilen unter dem Grenzwert liegen if (bild[max(zeilen),k]-eps <= 0): summeSpaltenmax +=1 if (bild[min(zeilen),k]-eps <= 0): summeSpaltenmin +=1 if summeZeilenmax != len(zeilen): # fügt zur Liste der Spalten die nächste Spalte hinzu, falls die größte Spalte nicht komplett unter dem Grenzwert liegt spalten.append(max(spalten)+1) if summeZeilenmin != len(zeilen):# fügt zur Liste der Spalten die voherige Spalte hinzu, falls die kleinste Spalte nicht komplett unter dem Grenzwert liegt spalten.append(min(spalten)-1) if summeSpaltenmax != len(spalten): # fügt zur Liste der Zeilen die nächste Zeile hinzu, falls die größte Zeile nicht komplett unter dem Grenzwert liegt zeilen.append(max(zeilen)+1) if summeSpaltenmin != len(spalten): # fügt zur Liste der Zeilen die voherige Zeile hinzu, falls die kleinste Zeile nicht komplett unter dem Grenzwert liegt zeilen.append(min(zeilen)-1) if (summeSpaltenmax+summeSpaltenmin) == 2* len(spalten) and (summeZeilenmax+summeZeilenmin)== 2* len(zeilen): # falls der komplette Rahmen unter dem Grenzwert liegt, werden die sortierten Zeilen und Spalten übergeben zeilen.sort() spalten.sort() return zeilen, spalten def partitionierung(bild, eps=8): bilder=[] #plt.imshow(bild, cmap="gray") #Befehle zum Anzeigen des Gesamtbildes #plt.show() #print bild.shape for i in range(bild.shape[1]): # sucht einen Punkt des Bildes, der über dem Grenzwert liegt for j in range(bild.shape[0]): if bild[j,i]- eps > 0: zeilen,spalten = filtern(bild, j, i, eps) teilbild = np.zeros(((len(zeilen)),(len(spalten)))) for p in range(len(zeilen)): for u in range(len(spalten)): # nimmt die Werte aus dem original Bild und schreibt sie in das Teilbild teilbild[p,u] = bild[zeilen[p],spalten[u]] bild[zeilen[p],spalten[u]]=0 # löscht das Teilbild aus dem orignial Bild bilder.append(teilbild) #plt.imshow(teilbild,cmap="gray") # Befehle zum anzeigen des Teilbildes #plt.show() return bilder