2014-12-27 2 views
0

У меня есть двумерный массив numpy, и я хочу замаскировать круговые области вокруг нескольких конкретных элементов. Это легко для элементов, не находящихся вблизи краев. Но когда диск становится усеченным для позиций вблизи края массива, операция маскирования генерирует исключение.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

ответ

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

+0

По дизайну mask_radius одинаково для всех коордов. – jtlz2

+0

Я не очень хорош в разрезе - не могли бы вы уточнить? – jtlz2

Смежные вопросы