【问题标题】:numpy circular mask cut-outs truncated at edges of 2D arraynumpy 圆形掩码切口在二维数组的边缘被截断
【发布时间】:2014-12-27 19:18:41
【问题描述】:

我有一个 2D numpy 数组,我想屏蔽几个特定元素周围的圆形区域。这对于不靠近边缘的元素很容易。但是当磁盘在靠近数组边缘的位置被截断时,掩码操作会引发异常。

屏蔽这些边缘源的好方法是什么?定期填充..?谢谢!

这里有一些代码:

import numpy as np

x_count = 20000
y_count = 20000

a = np.arange(y_count * x_count).reshape(y_count, x_count) # data
master_mask=np.zeros(a.shape).astype(bool)

coords=([10,50],[500,400])
nsrc=len(coords)
mask_radius=100 # 10, 20, etc.

for isrc in range(nsrc):
    xc=coords[isrc][0]; yc=coords[isrc][1]
    x,y = np.ogrid[-mask_radius:mask_radius+1,-mask_radius:mask_radius+1]
    minimask = x*x + y*y <= mask_radius*mask_radius
    box=master_mask[xc-mask_radius:xc+mask_radius+1,yc-mask_radius:yc+mask_radius+1]
    assert(minimask.shape==box.shape), 'This assertion should fail for discs touching the edge'
    master_mask[xc-mask_radius:xc+mask_radius+1,yc-mask_radius:yc+mask_radius+1] += minimask

print master_mask

【问题讨论】:

  • 向我们展示您的代码...

标签: python arrays numpy


【解决方案1】:

这是一个可能的(行人)答案,虽然我希望有一种更 numpy-esque 的方式。

import numpy as np

x_count = 20000
y_count = 20000

a = np.arange(y_count * x_count).reshape(y_count, x_count) # data
master_mask=np.zeros(a.shape).astype(bool)

coords=([10,50],[500,400])
nsrc=len(coords)
mask_radius=100 # 10, 20, etc.

for isrc in range(nsrc):
    xc=coords[isrc][0]; yc=coords[isrc][1]
    # Truncate the postage-stamp mask here
    xmin=max(xc-mask_radius,0); xmax=min(xc+mask_radius+1,x_count)
    ymin=max(yc-mask_radius,0); ymax=min(yc+mask_radius+1,y_count)
    x,y = np.ogrid[xmin:xmax,ymin:ymax]

    minimask = x*x + y*y <= mask_radius*mask_radius
    box=master_mask[xmin:xmax,ymin:ymax]
    #assert(minimask.shape==box.shape), 'This assertion should fail for discs near the edge'
    master_mask[xmin:xmax,ymin:ymax] += minimask

print master_mask

【讨论】:

  • 如果您可以确定所有坐标的 mask_radius 都相同,您可以预先计算一个圆形蒙版,然后对 master_mask 边缘附近的每个坐标进行切片。
  • 按照设计,所有坐标的 mask_radius 都是相同的。
  • 在以x,y = np.ogrid[-mask_radius:mask_radius+1,-mask_radius:mask_radius+1] 开始的循环外计算minimask。结果将是一个(mask_radius*2+1,mask_radius*2+1) 形数组,dtype 为bool。每当xcyc 接近master_mask 的边缘时,计算minimask 的切片对应于master_mask 周围xc,yc 的切片。查看您的代码,xmin:xmax,ymin:ymax 是 master_mask 的切片,因此 minimask 的相应切片将是(我认为)xmin+mask_radius-xc:xmax+mask_radius-xc,ymin+mask_radius-yc:ymax+mask_radius-yc
  • 那么,就是master_mask[bluh] |= minimask[bluh bluh]
猜你喜欢
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 2017-12-05
  • 1970-01-01
  • 2021-08-21
相关资源
最近更新 更多