我有一个霍夫变换,试图找到中心和半径都未知的圆圈,因此累加器空间是3维的。
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
的x,y空间由于某种原因我得不到具有最高分数的飞机但是使用拆开的指数来确定实际半径和中心给我正确的当我绘制它时的结果。
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])
答案 0 :(得分: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。