2012-12-18 33 views
9

Mam n: 2 macierz z punktami (x, y) znalezionymi z kropek w prostokątnym wzorcu kalibracji. Lubię sortować te punkty po kolei. Posortowałem te punkty za pomocą polecenia lexsort, ale zniekształcenie w kamerze jest zbyt duże, aby współrzędne y zachodziły na siebie.sortuj punkty kalibracji 2d z 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

Czy istnieje sposób, aby to rozwiązać przy pomocy wzoru Delaunaya będzie długie wiersze?

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

enter image description here

+0

Czy możesz liczyć na współrzędne x, które się nie nakładają? Możesz odwrócić kolejność sortowania, a następnie transponować wynikową macierz. To znacznie ułatwiłoby życie. Triangulacja Delaunaya może być bardziej odporna na małe nakładki, ale jeśli zniekształcenie jest zbyt duże, spowoduje to również rozbicie prostokątnego wzoru. – Jaime

+0

Dlaczego chcesz je sortować? Punktem kalibracji jest to, że możesz "po prostu" umieścić dużą liczbę punktów w algorytmach. Po wykonaniu kalibracji możesz przywrócić obraz, a punkty będą dokładnie na liniach. – RobAu

Odpowiedz

2

Korzystanie triangulacji jest rzeczywiście interesujący i może być stosowany na aplikacji:

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() 

W rezultacie można uzyskać poziome krawędzie w edges_horizontal, który jest 2d array [[p_{0},p_{1}], ..., [p_{n}, p_{n+1}]], w którym p_i są indeksami do tablicy coordinates.