Winkel aus Gradient
Da ich keine Funktion gefunden habe, die zu numpys gradient-Funktion die zugehörigen Winkel von 0 bis 2*pi zurückgibt, hier mal meine Implementierung. Man kann entweder direkt die Rückgabe von gradient übergeben, oder ein beliebiges Array mit allen y-Werten in der ersten und allen x-Werten in der zweiten Spalte (so wie es bei numpy üblich ist).
from numpy import pi, array, arctan, abs
def get_gradient_angle(gradients):
slope = abs(gradients[0]/ \
gradients[1].astype('float'))
angle = arctan(slope)
positive_y = gradients[0] >= 0
positive_x = gradients[1] >= 0
angle[(positive_y*(1-positive_x))
.nonzero()] = \
pi - angle[(positive_y*(1-positive_x))
.nonzero()]
angle[((1-positive_y)*(1-positive_x))
.nonzero()] += pi
angle[((1-positive_y)*positive_x)
.nonzero()] = \
2*pi - angle[((1-positive_y)*positive_x)
.nonzero()]
return angle
gradient_vectors = [(0, 1), (1, 1), (1, 0), \
(1, -1), (0, -1), (-1, -1), (-1, 0), \
(-1, 1), ]
gradient_data = array(zip(*gradient_vectors))
gradient_angle = get_gradient_angle(
gradient_data)
print gradient_angle * 180/pi
>> python gradient_angles.py
[ 0. 45. 90. 135. 180. 225. 270. 315.]
def get_gradient_angle(gradients):
slope = abs(gradients[0]/ \
gradients[1].astype('float'))
angle = arctan(slope)
positive_y = gradients[0] >= 0
positive_x = gradients[1] >= 0
angle[(positive_y*(1-positive_x))
.nonzero()] = \
pi - angle[(positive_y*(1-positive_x))
.nonzero()]
angle[((1-positive_y)*(1-positive_x))
.nonzero()] += pi
angle[((1-positive_y)*positive_x)
.nonzero()] = \
2*pi - angle[((1-positive_y)*positive_x)
.nonzero()]
return angle
gradient_vectors = [(0, 1), (1, 1), (1, 0), \
(1, -1), (0, -1), (-1, -1), (-1, 0), \
(-1, 1), ]
gradient_data = array(zip(*gradient_vectors))
gradient_angle = get_gradient_angle(
gradient_data)
print gradient_angle * 180/pi
>> python gradient_angles.py
[ 0. 45. 90. 135. 180. 225. 270. 315.]
- Kommentar schreiben