2014-12-27 107 views
0

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

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

下面是一些代码:

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 
+0

我们展示你的代码... – shx2 2014-12-27 20:07:28

回答

1

这里是一个可能(行人)的答案,但我会希望有会是一个更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] 
    # 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 
+0

如果你可以肯定的是mask_radius是所有坐标一样,你可以预先计算圆形掩蔽,然后切它每个坐标附近master_mask的边缘。 – codewarrior 2014-12-28 11:20:29

+0

设计mask_radius对于所有的坐标都是一样的。 – jtlz2 2014-12-28 16:11:33

+0

我不擅长切片 - 你能否详细说明一下? – jtlz2 2014-12-28 16:27:32