如何将圆盘形蒙版应用于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

这给出:


>> mask

array([[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_arr

array([[ 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.]])

有没有简单的方法可以使用此面膜?

慕标琳琳
浏览 726回答 3
3回答

慕田峪9158850

您可以使用scipy的卷积函数,该函数的好处是可以一次将任何特定的遮罩(即内核)放置在数组中任意数量的给定坐标上:import numpy as npfrom scipy.ndimage.filters import convolve首先创建一个坐标数组,其中将您希望遮罩(内核)居中的位置的坐标标记为2background = np.ones((10,10))background[5,5] = 2print(background)[[ 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.]&nbsp;[ 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.]&nbsp;[ 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.]&nbsp;[ 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.]&nbsp;[ 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.]&nbsp;[ 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 2.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.]&nbsp;[ 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.]&nbsp;[ 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.]&nbsp;[ 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.]&nbsp;[ 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.&nbsp; 1.]]创建您的面具:y,x = np.ogrid[-3: 3+1, -3: 3+1]mask = x**2+y**2 <= 3**2mask = 254*mask.astype(float)print(mask)[[&nbsp; &nbsp;0.&nbsp; &nbsp; 0.&nbsp; &nbsp; 0.&nbsp; 254.&nbsp; &nbsp; 0.&nbsp; &nbsp; 0.&nbsp; &nbsp; 0.]&nbsp;[&nbsp; &nbsp;0.&nbsp; 254.&nbsp; 254.&nbsp; 254.&nbsp; 254.&nbsp; 254.&nbsp; &nbsp; 0.]&nbsp;[&nbsp; &nbsp;0.&nbsp; 254.&nbsp; 254.&nbsp; 254.&nbsp; 254.&nbsp; 254.&nbsp; &nbsp; 0.]&nbsp;[ 254.&nbsp; 254.&nbsp; 254.&nbsp; 254.&nbsp; 254.&nbsp; 254.&nbsp; 254.]&nbsp;[&nbsp; &nbsp;0.&nbsp; 254.&nbsp; 254.&nbsp; 254.&nbsp; 254.&nbsp; 254.&nbsp; &nbsp; 0.]&nbsp;[&nbsp; &nbsp;0.&nbsp; 254.&nbsp; 254.&nbsp; 254.&nbsp; 254.&nbsp; 254.&nbsp; &nbsp; 0.]&nbsp;[&nbsp; &nbsp;0.&nbsp; &nbsp; 0.&nbsp; &nbsp; 0.&nbsp; 254.&nbsp; &nbsp; 0.&nbsp; &nbsp; 0.&nbsp; &nbsp; 0.]]卷积两个图像:b = convolve(background, mask)-sum(sum(mask))+1print(b)[[&nbsp; &nbsp;1.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.]&nbsp;[&nbsp; &nbsp;1.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.]&nbsp;[&nbsp; &nbsp;1.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.&nbsp; 255.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.]&nbsp;[&nbsp; &nbsp;1.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.&nbsp; 255.&nbsp; 255.&nbsp; 255.&nbsp; 255.&nbsp; 255.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.]&nbsp;[&nbsp; &nbsp;1.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.&nbsp; 255.&nbsp; 255.&nbsp; 255.&nbsp; 255.&nbsp; 255.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.]&nbsp;[&nbsp; &nbsp;1.&nbsp; &nbsp; 1.&nbsp; 255.&nbsp; 255.&nbsp; 255.&nbsp; 255.&nbsp; 255.&nbsp; 255.&nbsp; 255.&nbsp; &nbsp; 1.]&nbsp;[&nbsp; &nbsp;1.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.&nbsp; 255.&nbsp; 255.&nbsp; 255.&nbsp; 255.&nbsp; 255.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.]&nbsp;[&nbsp; &nbsp;1.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.&nbsp; 255.&nbsp; 255.&nbsp; 255.&nbsp; 255.&nbsp; 255.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.]&nbsp;[&nbsp; &nbsp;1.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.&nbsp; 255.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.]&nbsp;[&nbsp; &nbsp;1.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.&nbsp; &nbsp; 1.]]请注意,卷积函数项不会上下班,即convolve(a,b)!= convolve(b,a)还要注意,如果您的点在边缘附近,则算法不会在坐标处重现内核。为了解决这个问题,您可以使用内核的最大轴填充背景,应用卷积,然后删除填充。现在,您可以将任何内核映射到数组中任意数量的点,但是请注意,如果两个内核重叠,则它们会在重叠处相加。您可以根据需要设置阈值。
打开App,查看更多内容
随时随地看视频慕课网APP