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 if __name__=="__main__": # Aufruf der Funktion zum partitionieren mit Testbild bild=misc.imread("1+2.png") partitionierung(bild)