从3d ndarray显示切片

时间:2016-01-08 12:29:23

标签: python numpy multidimensional-array

我有一个霍夫变换,试图找到中心和半径都未知的圆圈,因此累加器空间是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])

然后我找到包含最高分的那个。 Slice with 3rd dimension fixed with <code>rr</code>

real maximum

实际上我期待这样的事情(这是来自我知道半径的2D hough变换): enter image description here

1 个答案:

答案 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