Der folgende Code sortiert unerwünschte Werte aus unserem Kantenbild aus, mit dem Ziel das Kanten ohne Aussagekraft nicht mitberechnet werden.
Stand vom 5. Januar:
#!/usr/bin/env python # -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt from scipy import misc, ndimage import cv2 bild=misc.imread('hund_mittel_kl.jpg',mode='F',) # Verschiebung in x-Richtung b=ndimage.filters.sobel(bild, axis=-1) # Verschiebung in y-Richtung b2=ndimage.filters.sobel(bild, axis=0) a=np.sqrt(b[1:,:]**2+b2[:-1,:]**2) # b und b2 werden zum Kantenbild a verrechnet plt.imshow(a,cmap=plt.get_cmap('gray'))
Mit der Percentile-Funktion wird dafür gesorgt, dass nur die 25% hellsten Punkte als Kandidaten aufgenommen werden.
Die Variablen z2 und s2 enthalten alle Zeilen und Spalten des Bildes (0,1,..,z-1 bzw 0,1,…,s-1), im Folgenden werden alle xy-Koordinaten des Bildes in die zunächst leere Liste 'alle_koordinaten' gepackt.
Aus 'alle_koordinaten' werden schließlich alle Punkte aus den oberen 25% in einer neue Liste 'kandidaten' gesammelt.
median2 = np.percentile(a,75) z = a.shape[0] #y z2 = range(0,z) s = a.shape[1] #x s2 = range(0,s) alle_koordinaten = [] for i in z2: for j in s2: alle_koordinaten.append((i,j)) kandidaten = [ p for p in alle_koordinaten if a[p[0],p[1]]>median2 ]
Die Funktion 'kurvenversuch' setzt auf alle ermittelten Kandidaten einen blauen Punkt.
def kurvenversuch(): 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) kurvenversuch()