2017-06-14 2 views
0

Ich mache ein paar Spurerkennung als ein lustiges Projekt und ich versuche, einen kubischen Spline zu erstellen, um die Spur darzustellen. Wenn ich jedoch die scipy CubicSpline-Funktion verwende, bekomme ich einige absurd große Werte.scipy kubischer Spline mit sehr großen y-Werten

Hier ist mein Code:

from scipy import interpolate 
from scipy.interpolate import CubicSpline 
from scipy.interpolate import InterpolatedUnivariateSpline 
from scipy.interpolate import interp1d 


rows = img_size[0] # width 
height = left_lane.shape[0] 
y_values = [0, height/2, height] 

plt.figure() 
plt.imshow(left_lane, cmap='gray') 
splines = [] 

particle = particles[0] 
cx = [particle[0], particle[1], particle[2]] 
cy = [y_values[0], y_values[1], y_values[2]] 

points = zip(cx, cy) 
points = sorted(points, key=lambda point: point[0]) 
x1, y1 = zip(*points) 

x1 = np.asarray(x1) 
y1 = np.asarray(y1) 
s = CubicSpline(x1, y1) 

new_x = np.arange(min(x1), max(x1), 0.1) 
new_y = s(new_x) 
plt.plot(new_x, new_y) 

plt.show() 

Hier ist der Ausgang:

plotted cubic spline

Hier ist das Originalbild mit den Kontrollpunkten aufgetragen:

original image with control points

Ich verstehe nicht warum der Spline-Algorithmus mir so große Werte für solch einen einfachen Spline gibt. Also, was ist das Problem hier? Schlechte Werte? Falsche Verwendung von kubischem Spline?

Vielen Dank für die Hilfe!

Antwort

0

Das Problem war, dass der Spline in diesem Bild vertikal geht, was bedeutet, dass der x-Wert nicht immer aufsteigend ist (z. B. 2. Kontrolle> 1. Kontrollpunkt). Also, wenn ich meine Listen sortiert habe, könnte so etwas passieren (2, 1, 3). Dann muss scipy einige große Koeffizienten verwenden, um zu diesem Spline zu passen.

Die Lösung bestand darin, die Achse so zu spiegeln, dass y jetzt die x-Achse ist. Jetzt verursacht die Sortierung keine seltsame Anordnung der Kontrollpunkte.

cx = [particle[0], particle[1], particle[2]] 
cy = [y_values[0], y_values[1], y_values[2]] 

# Sort particles in increasing x order 
points = zip(cx, cy) 
points = sorted(points, key=lambda point: point[1]) 
x1, y1 = zip(*points) 

x1 = np.asarray(x1) 
y1 = np.asarray(y1) 
s = CubicSpline(y1, x1) 

new_x = np.arange(min(y1), max(y1), 0.1) 
new_y = s(new_x) 
plt.plot(new_y, new_x) 
plt.plot(cx, cy, '.')