为了账号安全,请及时绑定邮箱和手机立即绑定

如何将圆盘形蒙版应用于NumPy阵列?

如何将圆盘形蒙版应用于NumPy阵列?

我有一个像这样的数组:>>> np.ones((8,8))array([[ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],       [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],       [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],       [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],       [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],       [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],       [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],       [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.]])我正在创建半径为3的圆盘形蒙版:y,x = np.ogrid[-3: 3+1, -3: 3+1]mask = x**2+y**2 <= 3**2这给出:>> maskarray([[False, False, False,  True, False, False, False],       [False,  True,  True,  True,  True,  True, False],       [False,  True,  True,  True,  True,  True, False],       [ True,  True,  True,  True,  True,  True,  True],       [False,  True,  True,  True,  True,  True, False],       [False,  True,  True,  True,  True,  True, False],       [False, False, False,  True, False, False, False]], dtype=bool)现在,我希望能够使用任何元素作为中心点将此蒙版应用于我的数组。因此,例如,以中心点为(1,1),我想要一个像这样的数组:>>> new_arrarray([[ True,  True,  True,  True,    1.,  1.,  1.,  1.],       [ True,  True,  True,  True,  True,  1.,  1.,  1.],       [ True,  True,  True,  True,    1.,  1.,  1.,  1.],       [ True,  True,  True,  True,    1.,  1.,  1.,  1.],       [ 1.,    True,    1.,    1.,    1.,  1.,  1.,  1.],       [ 1.,      1.,    1.,    1.,    1.,  1.,  1.,  1.],       [ 1.,      1.,    1.,    1.,    1.,  1.,  1.,  1.],       [ 1.,      1.,    1.,    1.,    1.,  1.,  1.,  1.]])有没有简单的方法可以使用此面膜?
查看完整描述

3 回答

?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

您可以使用scipy的卷积函数,该函数的好处是可以一次将任何特定的遮罩(即内核)放置在数组中任意数量的给定坐标上:


import numpy as np

from scipy.ndimage.filters import convolve

首先创建一个坐标数组,其中将您希望遮罩(内核)居中的位置的坐标标记为2


background = np.ones((10,10))

background[5,5] = 2

print(background)


[[ 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.]

 [ 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.]

 [ 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.]

 [ 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.]

 [ 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.]

 [ 1.  1.  1.  1.  1.  2.  1.  1.  1.  1.]

 [ 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.]

 [ 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.]

 [ 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.]

 [ 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.]]

创建您的面具:


y,x = np.ogrid[-3: 3+1, -3: 3+1]

mask = x**2+y**2 <= 3**2

mask = 254*mask.astype(float)

print(mask)


[[   0.    0.    0.  254.    0.    0.    0.]

 [   0.  254.  254.  254.  254.  254.    0.]

 [   0.  254.  254.  254.  254.  254.    0.]

 [ 254.  254.  254.  254.  254.  254.  254.]

 [   0.  254.  254.  254.  254.  254.    0.]

 [   0.  254.  254.  254.  254.  254.    0.]

 [   0.    0.    0.  254.    0.    0.    0.]]

卷积两个图像:


b = convolve(background, mask)-sum(sum(mask))+1

print(b)


[[   1.    1.    1.    1.    1.    1.    1.    1.    1.    1.]

 [   1.    1.    1.    1.    1.    1.    1.    1.    1.    1.]

 [   1.    1.    1.    1.    1.  255.    1.    1.    1.    1.]

 [   1.    1.    1.  255.  255.  255.  255.  255.    1.    1.]

 [   1.    1.    1.  255.  255.  255.  255.  255.    1.    1.]

 [   1.    1.  255.  255.  255.  255.  255.  255.  255.    1.]

 [   1.    1.    1.  255.  255.  255.  255.  255.    1.    1.]

 [   1.    1.    1.  255.  255.  255.  255.  255.    1.    1.]

 [   1.    1.    1.    1.    1.  255.    1.    1.    1.    1.]

 [   1.    1.    1.    1.    1.    1.    1.    1.    1.    1.]]

请注意,卷积函数项不会上下班,即convolve(a,b)!= convolve(b,a)


还要注意,如果您的点在边缘附近,则算法不会在坐标处重现内核。为了解决这个问题,您可以使用内核的最大轴填充背景,应用卷积,然后删除填充。


现在,您可以将任何内核映射到数组中任意数量的点,但是请注意,如果两个内核重叠,则它们会在重叠处相加。您可以根据需要设置阈值。


查看完整回答
反对 回复 2019-09-24
  • 3 回答
  • 0 关注
  • 688 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信