2012-12-18 18 views
9

Tôi có ma trận n: 2 với các điểm (x, y) được tìm thấy từ các chấm trong một mẫu hiệu chuẩn hình chữ nhật. Tôi thích sắp xếp các điểm này theo từng hàng. Tôi đã sắp xếp các điểm này với lexsort nhưng biến dạng từ máy ảnh quá lớn sao cho tọa độ y sẽ chồng lên nhau.sắp xếp các điểm mẫu hiệu chuẩn 2d với số lố

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ó cách nào để sắp xếp này với sự giúp đỡ của một mô hình Delaunay đi một chặng đường dài các hàng?

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

enter image description here

+0

Bạn có thể đếm trên các tọa độ x không chồng chéo không? Bạn có thể đảo ngược thứ tự sắp xếp của bạn và sau đó chuyển đổi ma trận kết quả. Điều đó sẽ làm cho cuộc sống dễ dàng hơn nhiều. Triangulation Delaunay có thể mạnh hơn đối với các chồng chéo nhỏ, nhưng nếu biến dạng quá lớn, nó cũng sẽ phá vỡ mẫu hình chữ nhật. – Jaime

+0

Tại sao bạn muốn sắp xếp chúng? Điểm hiệu chỉnh là bạn có thể 'chỉ' đặt một số lượng lớn các điểm trong các thuật toán. Sau khi hiệu chỉnh, bạn có thể khôi phục lại hình ảnh và các điểm sẽ chính xác trên các dòng. – RobAu

Trả lời

2

Sử dụng tam giác thực sự thú vị, và có thể được sử dụng cho các bạn ứng dụng:

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

Kết quả là, bạn sẽ có được các cạnh ngang trong edges_horizontal, đó là một mảng 2ngày [[p_{0},p_{1}], ..., [p_{n}, p_{n+1}]], trong đó p_i là chỉ mục vào mảng coordinates.

Các vấn đề liên quan