2015-02-28 3 views
0

Я хочу создать массив 2D numpy, заполненный кортежами. Каждый квадрат представляет собой пиксель, который связан с другой двумерной координатой с кортежем. Я знаю только несколько пар пикселей/кортежей. Поэтому мой массив должен интерполировать эти точки и должен быть каким-то линейным в другом месте. я начал с этим:создать массив двумерных чисел, содержащий кортежи

rows, cols : nb of rows and columns that the 2D array should have 
maxx, maxy : maximum of the x and y real coordinates. Their range is [0:maxx] and [0:maxy] 
interpolation = [((row1,col1),(x1,y1)),((row2,col2),(x2,y2))] 
X = (rows-1-np.mgrid[0:rows,0:cols][0])/(rows-1)*maxx 
Y = np.mgrid[0:rows,0:cols][1]/(cols-1)*maxy 
return np.vstack(([X.T], [Y.T])).T 

Но неты кортежей в сетке, и пары не интерполировать правильно координаты. На самом деле кортежи являются центрами кругов на сетке, как этот: calibration grid for opencv И я знаю реальные координаты всех кругов. Моя цель - иметь матрицу со всеми реальными координатами пикселей изображения, чтобы сделать 3D-сканер :-) Есть ли у кого-нибудь идеи? Спасибо!

+0

Вам нужен массив, содержащий индексы центральной точки всех точек? – wwii

+0

Остерегайтесь целочисленного деления – hpaulj

+0

Небольшой массив чисел будет более четким, чем ваше изображение. – hpaulj

ответ

0

Вы действительно хотите, чтобы tuples, или просто 3d-массив? Вы можете сделать 2d-массив с «кортежами» в качестве элементов, но это структурированный массив. Похоже, вы хотите, чтобы массив был (rows, cols, 2) в форме?

Целое подразделение может кусать вас.

In [282]: rows, cols = 5.,6. # make float 
In [283]: maxx, maxy = 80.,100. 
In [284]: X = (rows-1-np.mgrid[0:rows,0:cols][0])/(rows-1)*maxx 
In [285]: Y = np.mgrid[0:rows,0:cols][1]/(cols-1)*maxy 
In [288]: np.vstack(([X.T],[Y.T])) 
Out[288]: 
array([[[ 80., 60., 40., 20., 0.], 
     [ 80., 60., 40., 20., 0.], 
     [ 80., 60., 40., 20., 0.], 
     [ 80., 60., 40., 20., 0.], 
     [ 80., 60., 40., 20., 0.], 
     [ 80., 60., 40., 20., 0.]], 

     [[ 0., 0., 0., 0., 0.], 
     [ 20., 20., 20., 20., 20.], 
     [ 40., 40., 40., 40., 40.], 
     [ 60., 60., 60., 60., 60.], 
     [ 80., 80., 80., 80., 80.], 
     [ 100., 100., 100., 100., 100.]]]) 

я остановился окончательный .T, потому что (2,6,5) отображает более компактно. np.array([X,Y]).transpose([1,2,0]) должен делать то же самое, что и ваш vstack.

Это то, что вы хотите?

mgrid может сделать интерполяцию с параметром j:

In [307]: Y,X=np.mgrid[0:100:6j,80:0:5j] 
In [308]: np.array([X,Y]) 

np.linspace также удобно. Посмотрите также на ogrid и meshgrid.

Смежные вопросы