2012-12-18 8 views
9

Ich habe eine n: 2 Matrix mit Punkten (x, y) von Punkten in einem rechteckigen Kalibriermuster gefunden. Ich sortiere diese Punkte Zeile für Zeile. Ich habe diese Punkte mit lexsort sortiert, aber die Verzerrung von der Kamera ist zu groß, so dass y-Koordinaten überlappen werden.Sortieren 2d Kalibriermuster Punkte mit numpy

imageloading... 
blobs=imageprocessing.... 
coordinates=np.array([blob.centroid() for blob in blobs]) 
nd=np.lexsort((coordinates[:,0],coordinates[:,1])) 
coordinates=coordinates[ind] 

enter image description here

Gibt es eine Möglichkeit, dies zu sortieren mit Hilfe eines delaunay Muster lange die Reihen gehen?

import matplotlib.tri as tri 
x=coordinates[:,0] y=coordinates[:,1] 
triang = tri.Triangulation(x, y) 

enter image description here

+0

Können Sie sich darauf verlassen, dass die X-Koordinaten nicht überlappen? Sie können Ihre Sortierreihenfolge invertieren und dann die resultierende Matrix transponieren. Das würde das Leben viel einfacher machen. Die Delaunay-Triangulation ist möglicherweise robuster gegenüber kleinen Überlappungen, aber wenn die Verzerrung zu groß ist, wird auch das rechteckige Muster zerstört. – Jaime

+0

Warum möchten Sie sie sortieren? Der Punkt des Kalibrierens ist, dass Sie "nur" eine große Anzahl von Punkten in die Algorithmen einfügen können. Nach dem Kalibrieren können Sie das Bild wiederherstellen und die Punkte werden exakt auf Linien angezeigt. – RobAu

Antwort

2

Triangulation ist in der Tat interessant, und für Sie Anwendung verwendet werden:

import numpy as np 
import matplotlib.tri as tri 
import matplotlib.pyplot as plt 
import random 

# create fake data 
x,y = np.meshgrid(np.arange(10), np.arange(10)) 
x = x.flatten() 
y = y.flatten() 
coordinates = np.column_stack([x,y])+0.04 * np.random.rand(len(x), 2) 
np.random.shuffle(coordinates) 
x=coordinates[:,0] 
y=coordinates[:,1] 

# perform triangulation 
triang=tri.Triangulation(x,y) 
f = plt.figure(0) 
ax = plt.axes() 
tri.triplot(ax,triang) 

# find horizontal edges 
f = plt.figure(1) 
e_start = coordinates[triang.edges[:,0]] 
e_end = coordinates[triang.edges[:,1]] 
e_diff = e_end - e_start 
e_x = e_diff[:,0] 
e_y = e_diff[:,1] 

e_len = np.sqrt(e_x**2+e_y**2) 
alpha = 180*np.arcsin(e_y/e_len)/np.pi 

hist, bins, patches = plt.hist(alpha, bins=20) 

# in the histogram, we find that the 'horizontal' lines 
# have an alpha < 10. 

ind_horizontal = (-10<alpha) & (alpha < 10) 
edges_horizontal = triang.edges[ind_horizontal] 
plt.show() 

Als Ergebnis Sie die horizontalen Kanten in edges_horizontal erhalten, die ein 2D-Array ist [[p_{0},p_{1}], ..., [p_{n}, p_{n+1}]], wobei p_i Indizes in das coordinates Array sind.