2016-01-08 3 views
1

У меня есть преобразование Hough, которое пытается найти круги, где и центр и радиус неизвестны, поэтому пространство аккумулятора 3-мерное.Отображение фрагмента из 3d ndarray

DIMENSION = 200 
R_DIMENSION = 200 

xbins = np.linspace(-0.5,0.5,DIMENSION) 
ybins = np.linspace(-0.5,0.5,DIMENSION) 
rbins = np.linspace(0,0.5, R_DIMENSION) 

x,y,r = np.broadcast_arrays(xbins[...,np.newaxis,np.newaxis], \ 
           ybins[np.newaxis,...,np.newaxis], \ 
           rbins[np.newaxis,np.newaxis,...]) 
score = 0 
circle_counter = 0 
while True: 
    weights = np.zeros((DIMENSION, DIMENSION, R_DIMENSION)) 
    for x0,y0 in data['allPoints']: 
    s = 0.001 
    eta = (x-x0)**2 + (y-y0)**2 - r**2 
    weights += 1./(sqrt(2 * sconst.pi) * s) * np.exp(-(eta ** 2)\ 
                  /(2 * s ** 2)) 
    index = np.argmax(weights) 
    ii,jj,rr = np.unravel_index(index, (DIMENSION, DIMENSION, R_DIMENSION)) 
    score = weights[ii][jj][rr] 
    if score < 200: 
    break 

Теперь, если я хочу, чтобы визуализировать х, у пространства для rr по какой-то причине я не получаю самолет с наибольшим количеством очков, но с использованием разгадали индексов для определения фактического радиуса и центра дает мне право результат, когда я построю его.

circle = {} 
circle['center'] = (xbins[ii], ybins[jj]) 
circle['radius'] = rbins[rr] 
circles.append(circle) 

plt.imshow(weights[:][:][rr]) 
plt.colorbar() 
plt.show() 

Так что мой вопрос я неправильно, как я отобразить x,y плоскости для данного индекса радиуса?

Вот две фотографии визуализации. Второй содержит фактический максимум. То, что меня смущает в обеих картинах, состоит в том, что линии деформированы, что означает, что это не похоже на фиксированный радиус.

первое изображение было создано с imshow(weights[:][:][rr]) и второй один является из серии

for r_i in range(R_DIMENSION): 
    imshow(weights[:][:][r_i]) 

, а затем я нашел тот, который содержит наибольшее количество очков. Slice with 3rd dimension fixed with <code>rr</code>

real maximum

и на самом деле я ожидал что-то вроде этого (это из 2D преобразования Хока, где я знаю радиус): enter image description here

ответ

1

ОК, я нашел решение, но если кто-то может объясните мне это, что было бы здорово.

То, что я должен был изменить, как я транслируют массивы:

x,y,r = np.broadcast_arrays(xbins[np.newaxis,...,np.newaxis], \ 
          ybins[np.newaxis,np.newaxis,...], \ 
          rbins[...,np.newaxis,np.newaxis]) 

и, конечно, то изменение порядка индексов/измерений, где я использую их.

while True: 
    weights = np.zeros((R_DIMENSION, DIMENSION, DIMENSION)) 
    for x0,y0 in data['allPoints']: 
    s = 0.001 
    eta = (x-x0)**2 + (y-y0)**2 - r**2 
    weights += 1./(sqrt(2 * sconst.pi) * s) * np.exp(-(eta ** 2)\ 
                  /(2 * s ** 2)) 
    index = np.argmax(weights) 
    rr,ii,jj = np.unravel_index(index, (R_DIMENSION, DIMENSION, DIMENSION)) 
    score = weights[rr][ii][jj] 
    if score < 200: 
    print 'finished after %s circle(s) found' % circle_counter 
    break 

анимация различных радиусов для x,y плоскости, то выглядит this.

+1

Причина, по которой вам нужно использовать 'xbins [np.newaxis, ..., np.newaxis]', а не 'xbins [..., np.newaxis, np.newaxis]', потому что 'plt.imshow 'обрабатывает первое измерение 2D-массива как измерение * row * (т.е. * y *), а не размер * x *. –

+1

Несколько вещей: 1) вы можете заменить 'None' для' np.newaxis' для краткости 2) вам не нужно явно использовать 'np.broadcast_arrays' - вы можете просто выполнить' x [:, None, None ] - x0 и т. д., а numpy будет автоматически транслировать результат. 3) для эффективности вам следует избегать серийного индексирования, т. е. использовать 'weightights [rr, ii, jj]', а не 'weight [rr] [ii] [jj]'. –

+1

Кроме того, вы можете просто сделать 'score = weights.max()' –

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