Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
ws1314:turtlemod.py [2014/02/13 12:18] stefanborn angelegt |
ws1314:turtlemod.py [2016/05/10 14:46] (aktuell) |
||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== turtlemod.py ====== | ====== turtlemod.py ====== | ||
+ | |||
+ | Seht euch den Test in main() an, um zu verstehen, wie man das Turtle-Modul benutzt. Die kleine Komplikation, die Bildkoordinaten jeweils in Turtle-Koordinaten umrechenen zu müssen, ließ sich leider nicht ohne größeren Aufwand vermeiden. | ||
<code python> | <code python> | ||
- | import numpy as np | + | import turtle |
- | import scipy.signal as sig | + | |
- | import scipy | + | |
from scipy import misc | from scipy import misc | ||
+ | import pickle | ||
import cv2 | import cv2 | ||
+ | import numpy as np | ||
- | def schwarzweiss(bild_grau, schwelle): | + | def smooth(kont): |
- | '''Stellte ein Schwarzweiss Bild aus einem Grauwertbild her: | + | for i in range(1,len(kont)-1): |
- | Alle Punkte mit Grauwert über der Schwelle schwelle bekommen | + | kont[i]=1/3.*(kont[i-1]+kont[i]+kont[i+1]) |
- | den Wert 1., die übrigen 0. | + | |
- | Beachte: In OpenCV werden Fließkomma-Array so interpretiert, dass | + | |
- | 0.= schwarz, 1.=weiß, | + | |
- | ganzzahlige Arrays dagegen | + | |
- | 0= schwarz, 255=weiß. | + | |
- | Die Funktion geht von Fließkommabildern aus.''' | + | |
- | bildschwarzweiss=np.zeros_like(bild_grau,dtype=np.float32) | ||
- | zeilen,spalten = bild_grau.shape | + | |
- | for i in range(0,zeilen): | + | class MyTurtle(turtle.Turtle): |
- | for j in range(0,spalten): | + | |
- | if(bild_grau[i][j] < schwelle): | + | def turn_and_move(self,p): |
- | bildschwarzweiss[i][j] = 0. | + | self.setheading(self.towards(p)) |
- | else: | + | self.goto(p) |
- | bildschwarzweiss[i][j] = 1. | + | |
- | return bildschwarzweiss | + | class turtle_world(object): |
- | def glaetten(bild,n): | + | def __init__(self,bild): |
- | '''Glaetten durch Faltung''' | + | '''Richtet ein Turtle-Fenster mit dem Hintergrundsbild bild ein. |
- | if n==3: | + | Die Funktion erwartet ein opencv-Farbbild. Dabei ist zu beachten, |
- | return sig.convolve2d(bild, 1/16.*np.array([[1,2,1],[2,4,2],[1,2,1]]),mode='same') | + | dass opencv statt RGB die Bilder BGR speichert.''' |
- | elif n==5: | + | misc.imsave("bild_fuer_turtle.gif",bild[:,:,[2,1,0]]) |
- | return 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='same') | + | self.screen=turtle.Screen() |
- | elif n==9: | + | self.xsize=bild.shape[1] |
- | return sig.convolve2d(bild, (1/792.)\ | + | self.ysize=bild.shape[0] |
- | *np.array([[1,2,5,6,8,6,5,2,1],[2,4,10,12,16,12,10,4,2],[5,10,25,30,40,30,25,10,5],[6,12,30,36,48,36,30,12,6],\ | + | turtle.screensize(self.xsize,self.ysize) |
- | [8,16,40,48,64,48,40,16,8],[6,12,30,36,48,36,30,12,6],[5,10,25,30,40,30,25,10,5],[2,4,10,12,16,12,10,4,2],\ | + | turtle.bgpic("bild_fuer_turtle.gif") |
- | [1,2,5,6,8,6,5,2,1]]),mode='same') | + | self.t=MyTurtle() |
- | else: | + | self.t.pensize(2) |
- | raise Exception("Faltung mit n=%s nicht implementiert"%(str(n))) | + | self.t.pencolor("red") |
+ | self.t.shape("turtle") | ||
+ | |||
+ | |||
+ | def image_to_turtle(self,point): | ||
+ | '''Rechnet die Koordinaten des Bild-Arrays auf die Turtle-Koordinaten um. | ||
+ | Returns: Koordinatentupel.''' | ||
+ | |||
+ | return (point[1]-(self.xsize//2),(self.ysize//2)-point[0]) | ||
+ | |||
+ | def turtle_to_image(self,point): | ||
+ | '''Rechnet die Turtle-Koordinaten auf Bild-Array-Koordinaten | ||
+ | um. | ||
+ | Returns: numpy-Vektor mit Bildkoordinaten''' | ||
- | + | return np.array([self.ysize//2-point[1], point[0]+self.xsize//2]) | |
- | def laplace(bild): | + | |
- | '''Laplace-Faltung, hebt Kanten hervor, aber sehr rauschanfällig''' | + | |
- | return sig.convolve2d(bild, np.array([[1,1,1],[1,-8,1],[1,1,1]]),mode='same')*10. | + | |
- | + | ||
- | + | ||
- | def gradient(bild): | + | |
- | '''Berechnet den Betrag des Gradienten: Die Komponenten des Gradienten werden | + | |
- | durch Faltung bestimmt''' | + | |
- | bild_gradx=sig.convolve2d(bild, np.array([[1,0,-1],[2,0,-2],[1,0,-1]]),mode='same') | + | |
- | bild_grady=sig.convolve2d(bild, np.array([[1,0,-1],[2,0,-2],[1,0,-1]]).T,mode='same') | + | |
- | return(np.sqrt(bild_gradx*bild_gradx+bild_grady*bild_grady)) | + | |
- | + | ||
def main(): | def main(): | ||
- | l=misc.lena()/255. | + | '''Kleiner Test''' |
- | cv2.imshow("Lena", l) | + | l=misc.lena() |
- | cv2.imshow("Lena, glatt", glaetten(l,3)) | + | bild_farbbild=cv2.cvtColor(np.uint8(l),cv2.cv.CV_GRAY2BGR) |
- | cv2.imshow("Lena, glatter", glaetten(l,5)) | + | tw=turtle_world(bild_farbbild) |
- | cv2.imshow("Lena, glattest", glaetten(l,9)) | + | |
- | cv2.imshow("Lena, Laplace", laplace(l)) | + | |
- | cv2.imshow("Lena, Gradient", gradient(l)) | + | |
- | cv2.waitKey(0) | + | |
+ | punkte=[[50,50],[70,400],[200,100],[300,300]] | ||
+ | tw.t.penup() | ||
+ | for p in punkte: | ||
+ | tw.t.turn_and_move(tw.image_to_turtle(p)) | ||
+ | tw.t.pendown() | ||
+ | |||
return 0 | return 0 | ||
if __name__ == '__main__': | if __name__ == '__main__': | ||
main() | main() | ||
+ | |||
+ | |||
</code> | </code> |