У меня есть преобразование 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])
, а затем я нашел тот, который содержит наибольшее количество очков.
и на самом деле я ожидал что-то вроде этого (это из 2D преобразования Хока, где я знаю радиус):
Причина, по которой вам нужно использовать 'xbins [np.newaxis, ..., np.newaxis]', а не 'xbins [..., np.newaxis, np.newaxis]', потому что 'plt.imshow 'обрабатывает первое измерение 2D-массива как измерение * row * (т.е. * y *), а не размер * x *. –
Несколько вещей: 1) вы можете заменить 'None' для' np.newaxis' для краткости 2) вам не нужно явно использовать 'np.broadcast_arrays' - вы можете просто выполнить' x [:, None, None ] - x0 и т. д., а numpy будет автоматически транслировать результат. 3) для эффективности вам следует избегать серийного индексирования, т. е. использовать 'weightights [rr, ii, jj]', а не 'weight [rr] [ii] [jj]'. –
Кроме того, вы можете просто сделать 'score = weights.max()' –