Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
ws1314:gruppe_2 [2014/01/30 17:12] annan |
ws1314:gruppe_2 [2016/05/10 14:46] (aktuell) |
||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
Bild von der Kamera einlesen: | Bild von der Kamera einlesen: | ||
- | capture= cv2.VideoCapture(0) | + | <code python>capture= cv2.VideoCapture(0) |
- | res,bild=capture.read() | + | res,bild=capture.read() |
+ | </code> | ||
Bild in grau umwandeln: | Bild in grau umwandeln: | ||
- | bild_grau=cv2.cvtColor(bild,cv2.cv.CV_BGR2GRAY) | + | <code python>bild_grau=cv2.cvtColor(bild,cv2.cv.CV_BGR2GRAY) |
+ | </code> | ||
Kopie eines Bildes erstellen: | Kopie eines Bildes erstellen: | ||
- | bild_kopie=bild.copy() | + | <code python>bild_kopie=bild.copy() |
+ | </code> | ||
Bildgröße anzeigen (Zeilen, Spalten, (Anzahl der Farbkanäle)): | Bildgröße anzeigen (Zeilen, Spalten, (Anzahl der Farbkanäle)): | ||
- | print "Shape ", bild.shape | + | <code python>print "Shape ", bild.shape |
+ | </code> | ||
Definieren der Zeilen und Spalten (Anzahl der Variablen muss gleich sein): | Definieren der Zeilen und Spalten (Anzahl der Variablen muss gleich sein): | ||
- | zeilen, spalten=bild.shape | + | <code python>zeilen, spalten=bild.shape |
+ | </code> | ||
+ | Wenn man einen Punkt im array verändert, verändert man seine Farbe: | ||
+ | <code python>bild[j,i] = (255 , 255 , 255) --> "Weiß" </code> | ||
+ | j entspricht der Zeile, i der Spalte. | ||
- | Einen Punkt im "array" verändert: | ||
- | for i in range(zeilen): | ||
- | bild_kopie[50,i] = (255 , 255 , 255) | ||
- | bild_kopie[51,i] = (255 , 255 , 255) | ||
- | |||
- | for i in range(spalten): | ||
- | bild_kopie[i,50] = (255 , 255 , 255) | ||
- | bild_kopie[i,51] = (255 , 255 , 255) | ||
Faltung (abstrakt): | Faltung (abstrakt): | ||
- | bild=sig.convolve2d(A, B, Parameter)/255. (-> 255,da Grauwerte mit einem Wert nicht zwischen 255 und 0 sondern zwischen 0 und 1 gespeichert werden, "." damit es als double interpretiert wird(muss so sein)) | + | <code python>bild=sig.convolve2d(A, B, Parameter)/255. </code> |
+ | (-> /255,da Grauwerte mit einem Wert nicht zwischen 255 und 0 sondern zwischen 0 und 1 gespeichert werden, "." damit es als double interpretiert wird(muss so sein)) | ||
Dafür muss man scipy.signal importieren, z.B als sig (s. oben) | Dafür muss man scipy.signal importieren, z.B als sig (s. oben) | ||
* A ist das Bild, was man "falten" will. | * A ist das Bild, was man "falten" will. | ||
Zeile 34: | Zeile 31: | ||
* "fillvalue". | * "fillvalue". | ||
speziell: "Entrauschungs-faltung": | speziell: "Entrauschungs-faltung": | ||
- | bild_neu=sig.convolve2d(bild_kopie, 0.1*np.array([[1,1,1],[1,2,1],[1,1,1]]),mode='valid')/255. | + | <code python>bild_neu=sig.convolve2d(bild, 0.1*np.array([[1,1,1],[1,2,1],[1,1,1]]),mode='valid')/255. </code> |
Beispiel für eine 5x5 entrauschungsmatrix: | Beispiel für eine 5x5 entrauschungsmatrix: | ||
- | bild_neu=sig.convolve2d(bild_kopie, (1/256.)*np.array([[1,4,6,4,1],[4,16,24,16,4],[6,24,36,24,6],[4,16,24,16,4],[1,4,6,4,1]]) | + | <code python>bild_neu=sig.convolve2d(bild, (1/256.)*np.array([[1,4,6,4,1],[4,16,24,16,4],[6,24,36,24,6],[4,16,24,16,4],[1,4,6,4,1]]) |
- | ,mode='valid')/255. | + | ,mode='valid')/255. </code> |
| | ||
Schwellenwert finden (Graubild -> Schwarz-Weiß-Bild) | Schwellenwert finden (Graubild -> Schwarz-Weiß-Bild) | ||
- | bildgrau=bildschwarzweiss.copy() | + | <code python>bild_schwarzweiss=bild_grau.copy() |
- | zeilen, spalten=bildschwarzweiss.shape | + | zeilen, spalten=bild_schwarzweiss.shape |
- | for i in range(0,zeilen): | + | for i in range(0,zeilen): |
- | for j in range(0,spalten): | + | for j in range(0,spalten): |
- | if(bildgrau[i][j] < 0.3): | + | if(bild_grau[i][j] < 0.3): |
- | bildgrau[i][j] = 0 | + | bild_schwarzweiss[i][j] = 0 |
- | else: | + | else: |
- | bildgrau[i][j] = 1 | + | bild_schwarzweiss[i][j] = 1 |
+ | </code> | ||
Es gib 2 for-Schleifen, damit jeder Pixel in jeder Zeile und Spalte einzeln abgegangen wird. Für jeden Pixel wird abgewägt, ob der Grauwert über oder unter dem Schwellenwert (hier 0.3) liegt. Liegt er darunter, wird der Pixel schwarz (Grauwert 0), ist er darüber, wird er weiß (1). | Es gib 2 for-Schleifen, damit jeder Pixel in jeder Zeile und Spalte einzeln abgegangen wird. Für jeden Pixel wird abgewägt, ob der Grauwert über oder unter dem Schwellenwert (hier 0.3) liegt. Liegt er darunter, wird der Pixel schwarz (Grauwert 0), ist er darüber, wird er weiß (1). | ||
+ | |||
+ | |||
+ | Punkt suchen: | ||
+ | <code python>gefunden = False | ||
+ | for i in range(0,spalten): | ||
+ | for j in range(0,zeilen): | ||
+ | if(bild[i][j] == 1): | ||
+ | breite = i | ||
+ | laenge = j | ||
+ | gefunden = True | ||
+ | break | ||
+ | if gefunden: | ||
+ | break | ||
+ | </code> | ||
+ | |||
+ | breite entspricht der Spalte in der der Punkt gefunden wurde, länge der zeile, statt "1" kann jeder andere Wert genommen werden. "gefunden" stellt sicher, ob ein Punkt gefunden wurde. | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | Konturensuche in eine bestimmte Richtung: | ||
+ | <code python> | ||
+ | p = [breite,laenge] | ||
+ | contour.append(p) | ||
+ | v = [1,0] | ||
+ | fertig = False | ||
+ | while (not fertig): | ||
+ | if(bild[(p[0]+v[0])] [(p[1]+v[1])]): | ||
+ | p1 = [(p[0]+v[0]),(p[1]+v[1])] | ||
+ | contour.append(p1) | ||
+ | p = p1 | ||
+ | </code> | ||
+ | Es werden nur die Punkte ein Array eingetragen*seufz* | ||
+ | |||
+ | Konturensuche in alle Richtungen: | ||
+ | <code python>gefunden = False | ||
+ | if( bild_schwarzweiss[(p[0] + 1)][(p[1]+1)]): | ||
+ | p1 = [(p[0] + 1)][(p[1]+1)] | ||
+ | v = [1][1] | ||
+ | gefunden = True | ||
+ | contour.append(p1) | ||
+ | p = p1 | ||
+ | break | ||
+ | if(bild[(p[0])] [(p[1]+1)]): | ||
+ | p1 = [(p[0])] [(p[1]+1)] | ||
+ | v = [0][1] | ||
+ | gefunden = True | ||
+ | contour.append(p1) | ||
+ | p = p1 | ||
+ | break | ||
+ | if(bild[(p[0] - 1)][(p[1]+1)]): | ||
+ | p1 = [(p[0] - 1)][(p[1]+1)] | ||
+ | v = [-1][1] | ||
+ | gefunden = True | ||
+ | contour.append(p1) | ||
+ | p = p1 | ||
+ | break | ||
+ | if(bild[(p[0] + 1)][(p[1])]): | ||
+ | p1 = [(p[0] + 1)][(p[1])] | ||
+ | v = [1][0] | ||
+ | gefunden = True | ||
+ | contour.append(p1) | ||
+ | p = p1 | ||
+ | break | ||
+ | if(Richtung == 4 and bild[(p[0] - 1)][(p[1])]): | ||
+ | p1 = [(p[0] - 1)][(p[1])] | ||
+ | v = [-1][0] | ||
+ | gefunden = True | ||
+ | contour.append(p1) | ||
+ | p = p1 | ||
+ | break | ||
+ | if(bild[(p[0] + 1)][(p[1] - 1)]): | ||
+ | p1 = [(p[0] + 1)][(p[1] - 1)] | ||
+ | v = [1][-1] | ||
+ | gefunden = True | ||
+ | contour.append(p1) | ||
+ | p = p1 | ||
+ | break | ||
+ | if(bild[(p[0])] [(p[1]) - 1]): | ||
+ | p1 = [(p[0])] [(p[1]) - 1] | ||
+ | v = [0][-1] | ||
+ | gefunden = True | ||
+ | contour.append(p1) | ||
+ | p = p1 | ||
+ | break | ||
+ | if(bild[(p[0]-1)] [(p[1] - 1)]): | ||
+ | p1 = [(p[0]-1)] [(p[1] - 1)] | ||
+ | v = [-1][-1] | ||
+ | gefunden = True | ||
+ | contour.append(p1) | ||
+ | p = p1 | ||
+ | break | ||
+ | </code> | ||
+ | Wieder wird durch "gefunden" sichergestellt, dass etwas gefunden wurde. Jede Richtung wird untersucht, wird etwas gefunden, gibt es einen Abbruch. | ||
+ | die Richtung in die gegangen wurde wird unter der Variable "v" gespeichert. Der neue Punkt ist "p1", der alte Punkt heisst "p". Am Ende wird "p" verändert, damit die Prozedur von neuem beginnen kann. | ||
+ | |||
+ | Hier eine kleine Vereinfachung: | ||
+ | <code python>def Nebenstellen(bild ,v ,p ): | ||
+ | gefunden = False | ||
+ | if(bild[(p[0] + v[0])] [(p[1]+v[1])]): | ||
+ | p1 = [(p[0] + v[0]),(p[1]+v[1])] | ||
+ | gefunden = True | ||
+ | p = p1 | ||
+ | if gefunden: | ||
+ | return p, v, gefunden | ||
+ | return False | ||
+ | if Nebenstellen(bild ,[1,1] ,p ): | ||
+ | p, v, gefunden = Nebenstellen(bild ,[1,1] ,p ) | ||
+ | contour.append(p) | ||
+ | if Nebenstellen(bild ,[0,1] ,p ): | ||
+ | p, v, gefunden = Nebenstellen(bild ,[1,1] ,p ) | ||
+ | contour.append(p) | ||
+ | if Nebenstellen(bild ,[-1,1] ,p ): | ||
+ | p, v, gefunden = Nebenstellen(bild ,[1,1] ,p ) | ||
+ | contour.append(p) | ||
+ | if Nebenstellen(bild ,[1,0] ,p ): | ||
+ | p, v, gefunden = Nebenstellen(bild ,[1,1] ,p ) | ||
+ | contour.append(p) | ||
+ | if Nebenstellen(bild ,[0,0] ,p ): | ||
+ | p, v, gefunden = Nebenstellen(bild ,[1,1] ,p ) | ||
+ | contour.append(p) | ||
+ | if Nebenstellen(bild ,[-1,0] ,p ): | ||
+ | p, v, gefunden = Nebenstellen(bild ,[1,1] ,p ) | ||
+ | contour.append(p) | ||
+ | if Nebenstellen(bild ,[1,-1] ,p ): | ||
+ | p, v, gefunden = Nebenstellen(bild ,[1,1] ,p ) | ||
+ | contour.append(p) | ||
+ | if Nebenstellen(bild ,[0,-1] ,p ): | ||
+ | p, v, gefunden = Nebenstellen(bild ,[1,1] ,p ) | ||
+ | contour.append(p) | ||
+ | if Nebenstellen(bild ,[-1,-1] ,p ): | ||
+ | p, v, gefunden = Nebenstellen(bild ,[1,1] ,p ) | ||
+ | contour.append(p) | ||
+ | </code> |