2012-12-18 19 views
9

Ho una matrice n: 2 con punti (x, y) trovati da punti in un modello di calibrazione rettangolare. Mi piace ordinare questi punti riga per riga. Ho ordinato questi punti con lexsort ma la distorsione dalla fotocamera è troppo grande in modo che le coordinate y si sovrappongano.ordina punti di calibrazione 2d con 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

C'è un modo per risolvere la questione con l'aiuto di un modello di Delaunay andando un lungo le righe?

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

enter image description here

+0

Riesci a contare sulle coordinate x non sovrapposte? È possibile invertire il proprio ordine di selezione e quindi trasporre la matrice risultante. Ciò renderebbe la vita molto più semplice. La triangolazione di Delaunay può essere più robusta rispetto alle piccole sovrapposizioni, ma se la distorsione è troppo grande, si romperà anche il motivo rettangolare. – Jaime

+0

Perché dovresti ordinarli? Il punto di calibrazione è che puoi "solo" inserire un gran numero di punti negli algoritmi. Dopo la calibrazione, è possibile ripristinare l'immagine e i punti saranno esattamente sulle linee. – RobAu

risposta

2

Uso triangolazione è davvero interessante, e può essere usato per applicazione:

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

Di conseguenza, si ottengono i bordi orizzontali edges_horizontal, che è un array 2d [[p_{0},p_{1}], ..., [p_{n}, p_{n+1}]], in cui p_i sono indici nell'array coordinates.

Problemi correlati