Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
ws1617:bilder_zu_bildern:protokolle:170216 [2017/03/24 14:36] isabelschwermer |
ws1617:bilder_zu_bildern:protokolle:170216 [2017/04/06 20:21] (aktuell) Chai_Tee.95-Cara |
||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
=== Protokoll vom 16. Februar 2017 === | === Protokoll vom 16. Februar 2017 === | ||
- | Unser aktuelles Programm: | + | |
+ | Da heute der letzte Termin ist, haben wir uns vor allem damit beschäftigt, das Programm zu säubern und ein paar Kleinigkeiten zu verbessern. Somit ist folgender Code unsere finale Version, ohne kreative Ausgabe (Für die finale Version mit kreativer Ausgabe, siehe [[ws1617:bilder_zu_bildern:protokolle:170223|Protokoll vom Blocktermin (23./24. Februar 2017)]]). | ||
<code python> | <code python> | ||
#!/usr/bin/env python | #!/usr/bin/env python | ||
Zeile 9: | Zeile 10: | ||
from scipy import misc, ndimage, signal | from scipy import misc, ndimage, signal | ||
import cv2 | import cv2 | ||
- | import scipy.misc as misc | ||
import skimage.color as color | import skimage.color as color | ||
import turtle | import turtle | ||
import pickle | import pickle | ||
- | |||
- | laenge=int(raw_input("Geben Sie die Laenge der Niveaulinien an: ")) | ||
- | percentile=int(raw_input("Geben Sie die Staerke der Kanten an(max bis 100): ")) | ||
- | |||
- | #bild=misc.imread('Heuchera.jpg') # bild einlesen | ||
- | |||
- | cap = cv2.VideoCapture(0) #bei kamera bild wird zu bild2 | ||
- | res, bild = cap.read() #bei kamera | ||
- | |||
- | imgray =color.rgb2gray(bild) | ||
- | |||
from skimage.measure import find_contours | from skimage.measure import find_contours | ||
+ | |||
+ | minimum=int(raw_input("Minimum: ")) | ||
+ | percentile=int(raw_input("Staerke der Kanten (max bis 100): ")) | ||
+ | |||
+ | cap = cv2.VideoCapture(0) | ||
+ | res, bild = cap.read() | ||
+ | imgray = color.rgb2gray(bild) | ||
+ | |||
res = [] | res = [] | ||
- | for value in np.linspace(np.min(imgray), np.max(imgray),10): | + | for value in np.linspace(np.min(imgray), np.max(imgray),30): |
res.extend(find_contours(imgray,value)) | res.extend(find_contours(imgray,value)) | ||
- | + | ||
- | cap.release() #wenn kamera | + | cap.release() |
- | + | ||
def Isolux(): | def Isolux(): | ||
- | #a_als_farbbild = cv2.cvtColor(a, cv2.COLOR_GRAY2BGR) #a ist ein s/w-bild, um farbe überhaupt anzeigen zu können, wird es in ein bgr konvertiert | ||
res2 = [] | res2 = [] | ||
for cont in res: | for cont in res: | ||
- | if cont.shape[0]>laenge: #and ... Fkt.Check | + | if cont.shape[0]>minimum: |
- | for i,j in cont: | + | |
- | cv2.circle(bild,(int(round(j)),int(round(i))),1,(1,0,0),-1) | + | |
res2.append(cont) | res2.append(cont) | ||
- | #cv2.imshow("Bild:",bild) | ||
- | #cv2.waitKey(0) | ||
- | #cv2.destroyAllWindows() | ||
return res2 | return res2 | ||
- | + | ||
- | res2 = Isolux() # unsere Liste der gewünschten Contours res2 (ausgefiltert) | + | res2 = Isolux() #unsere Liste der gewünschten Contours res2 (zu Kurze ausgefiltert) |
- | + | ||
- | #print res2 # Contouren! | + | |
- | + | ||
- | #for cont in res2: | + | |
- | # print cont.shape # Contourenanzahl | + | |
- | + | ||
- | #Kantenprogramm | + | |
- | import numpy as np | + | |
- | import matplotlib.pyplot as plt | + | |
- | from scipy import misc, ndimage | + | |
- | import cv2 | + | |
- | #bild=misc.imread('Heuchera.jpg',mode='F',) | + | |
- | + | ||
bild=ndimage.filters.gaussian_filter(bild,1.5) | bild=ndimage.filters.gaussian_filter(bild,1.5) | ||
- | # x | + | b=ndimage.filters.sobel(imgray, axis=-1) #Verschiebungsbild x |
- | b=ndimage.filters.sobel(imgray, axis=-1) #Verschiebungsbild, x | + | b2=ndimage.filters.sobel(imgray, axis=0) #Verschiebungsbild y |
- | + | ||
- | # y | + | a=np.sqrt(b[1:,:]**2+b2[:-1,:]**2) #b und b2 werden zum Kantenbild a verrechnet |
- | b2=ndimage.filters.sobel(imgray, axis=0) #Verschiebungsbild, y | + | |
- | + | ||
- | a=np.sqrt(b[1:,:]**2+b2[:-1,:]**2) # b und b2 werden zum Kantenbild a verrechnet #Kantenbild | + | |
- | + | ||
median2 = np.percentile(a,percentile) | median2 = np.percentile(a,percentile) | ||
z = a.shape[0] #y | z = a.shape[0] #y | ||
z2 = range(0,z) | z2 = range(0,z) | ||
- | + | ||
s = a.shape[1] #x | s = a.shape[1] #x | ||
s2 = range(0,s) | s2 = range(0,s) | ||
- | + | ||
alle_koordinaten = [] | alle_koordinaten = [] | ||
for i in z2: | for i in z2: | ||
for j in s2: | for j in s2: | ||
alle_koordinaten.append((i,j)) | alle_koordinaten.append((i,j)) | ||
- | + | ||
- | kandidaten = [ p for p in alle_koordinaten if a[p[0],p[1]]>median2 ] #Rumspielbar...mit Schwellenwert | + | kandidaten = [ p for p in alle_koordinaten if a[p[0],p[1]]>median2 ] |
- | + | ||
- | + | contouren = res2 #Liste in Listen | |
- | def kurvenversuch(): #Nur zum Veranschaulichen! | + | kant = kandidaten |
- | a_als_farbbild = cv2.cvtColor(a, cv2.COLOR_GRAY2BGR) #a ist ein s/w-bild, um farbe überhaupt anzeigen zu können, wird es in ein bgr konvertiert | + | |
- | for i,j in kandidaten: | + | |
- | cv2.circle(a_als_farbbild,(j,i),1,(1,0,0),-1) | + | |
- | cv2.imshow("1:",a_als_farbbild) | + | |
- | cv2.waitKey(0) | + | |
- | cv2.destroyAllWindows() | + | |
- | + | ||
- | contouren = res2 #Liste in Listen | + | |
- | kant = kandidaten #hat Schwellenwert | + | |
- | #Kantenbild = a | + | |
Schwellw = np.median(a) | Schwellw = np.median(a) | ||
beste_Werte = [] | beste_Werte = [] | ||
- | + | ||
def check(cont, Kant): | def check(cont, Kant): | ||
- | hell = 0. #auf 0 gesetzt | + | hell = 0. |
for pkt in cont: | for pkt in cont: | ||
- | try: # try aufgrund der Rundungsfehler, über 319 | + | try: #try, da es hier oft zu Rundungsfehlern kommt |
- | hell += a[int(round(pkt[0])),int(round(pkt[1]))] #werden aufgerechnet | + | hell += a[int(round(pkt[0])),int(round(pkt[1]))] |
except: | except: | ||
pass | pass | ||
- | |||
if hell > Schwellw*len(cont): | if hell > Schwellw*len(cont): | ||
return True | return True | ||
- | |||
else: | else: | ||
return False | return False | ||
- | + | ||
for cont in contouren: | for cont in contouren: | ||
if check(cont, a): | if check(cont, a): | ||
beste_Werte.append(cont) | beste_Werte.append(cont) | ||
- | |||
else: | else: | ||
pass | pass | ||
- | + | ||
- | def smooth(kont): #? | + | def smooth(kont): |
for i in range(1,len(kont)-1): | for i in range(1,len(kont)-1): | ||
kont[i]=1/3.*(kont[i-1]+kont[i]+kont[i+1]) | kont[i]=1/3.*(kont[i-1]+kont[i]+kont[i+1]) | ||
- | + | ||
- | class MyTurtle(turtle.Turtle): #? | + | class MyTurtle(turtle.Turtle): |
def turn_and_move(self,p): | def turn_and_move(self,p): | ||
self.setheading(self.towards(p)) | self.setheading(self.towards(p)) | ||
self.goto(p) | self.goto(p) | ||
- | + | ||
class turtle_world(object): | class turtle_world(object): | ||
def __init__(self,bild): #pencv speichert die Bilder als BGR! | def __init__(self,bild): #pencv speichert die Bilder als BGR! | ||
Zeile 132: | Zeile 96: | ||
self.xsize=bild.shape[1] | self.xsize=bild.shape[1] | ||
self.ysize=bild.shape[0] | self.ysize=bild.shape[0] | ||
- | turtle.screensize(self.xsize,self.ysize) | + | turtle.screensize(self.xsize,self.ysize) |
- | misc.imsave("zwischenbild_.gif",bild) | + | |
- | #turtle.bgpic("zwischenbild_.gif") #Setzt das Hintergrudbild weg | + | |
self.t=MyTurtle() | self.t=MyTurtle() | ||
self.t.pensize(1) | self.t.pensize(1) | ||
- | self.t.pencolor("blue") | + | self.t.pencolor("black") |
self.t.shape("turtle") | self.t.shape("turtle") | ||
self.t.speed(0) | self.t.speed(0) | ||
- | self.t.tracer(0,delay=0) #nur 0 für Mac turtle, 1 bei normal | + | self.t.tracer(0,delay=0) |
- | + | ||
def image_to_turtle(self,point): | 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]) | return (point[1]-(self.xsize//2),(self.ysize//2)-point[0]) | ||
- | + | ||
def turtle_to_image(self,point): | 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]) | return np.array([self.ysize//2-point[1], point[0]+self.xsize//2]) | ||
- | + | ||
- | #______________________ | + | |
- | + | ||
- | + | ||
def bewege_turtle_auf_bild(bild,kontouren): | def bewege_turtle_auf_bild(bild,kontouren): | ||
- | '''Lässt Turtle auf Hintergrundbild laufen. | + | tw=turtle_world(bild) |
- | Dabei ist bild ein BGR-Bild (opencv-Farbbild) | + | |
- | und kontouren eine Liste von Listen von Punkten.''' | + | for kontour in kontouren: |
- | + | tw.t.penup() | |
- | tw=turtle_world(bild) | + | for p in kontour: |
- | + | tw.t.turn_and_move(tw.image_to_turtle(p)) | |
- | for kontour in kontouren: #mac turtle:Hier Zähler einbauen, der alle 20. Konturen einmal zeichnet, damit es nicht zu schnell geht | + | tw.t.pendown() |
- | tw.t.penup() | + | turtle.update() |
- | for p in kontour: | + | |
- | tw.t.turn_and_move(tw.image_to_turtle(p)) | + | no = int(raw_input("Geben Sie eine natuerliche Zahl ein: ")) |
- | tw.t.pendown() | + | m = np.array([[0,-1],[1,0]]) |
- | turtle.update() #nur bei Mac turtle | + | |
- | + | l = [] | |
+ | l2 = [] | ||
+ | |||
+ | if no > 0: | ||
+ | for i in range(no): | ||
+ | tw.t.pendown() | ||
+ | pos = turtle.position() | ||
+ | gradient = np.array((b[int(pos[0]),int(pos[1])],b2[int(pos[0]),int(pos[1])])) #b 0 1 b2 0 1 | ||
+ | winkel = np.arctan2(gradient[0],[1])*180/np.pi | ||
+ | tw.t.setheading(winkel+90) | ||
+ | tw.t.pencolor("red") | ||
+ | tw.t.pensize(2) | ||
+ | |||
+ | tw.t.fd(50) | ||
+ | tw.t.lt(45) | ||
+ | tw.t.fd(50) | ||
+ | |||
+ | l.append(pos) | ||
+ | else: | ||
+ | print "Das ist keine natuerliche Zahl!" | ||
+ | |||
+ | turtle.update() | ||
def main(): | def main(): | ||
- | #l=misc.ascent() | + | bild_farbbild=cv2.cvtColor(np.uint8(imgray),cv2.cv.CV_GRAY2BGR) |
- | bild_farbbild=cv2.cvtColor(np.uint8(imgray),cv2.cv.CV_GRAY2BGR) | + | kontouren=beste_Werte |
- | #kontour=[[50,50],[70,400],[200,100],[300,300]] #hier Konturen übergeben? | + | bewege_turtle_auf_bild(bild_farbbild,kontouren) |
- | kontouren=beste_Werte | + | return 0 |
- | + | ||
- | bewege_turtle_auf_bild(bild_farbbild,kontouren) | + | |
- | return 0 | + | |
- | + | ||
- | if __name__ == '__main__': | + | |
- | main() | + | |
+ | main() | ||
</code> | </code> | ||
+ | |||
+ | Ergebnis: | ||
+ | {{feb_16.png}} \\ | ||
+ | |||
+ | Am Ende haben wir uns außerdem Gedanken darüber gemacht, wie man die Ausgabe gestalten kann. Dem wollen wir uns dann am Blocktermin zuwenden. |