Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

ss16:segmentierung

Segmentierung

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
 
ss16/segmentierung.txt · Zuletzt geändert: 2016/09/23 14:43 von victorbremer