Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 二元_膨胀的对立面_Python_Numpy - Fatal编程技术网

Python 二元_膨胀的对立面

Python 二元_膨胀的对立面,python,numpy,Python,Numpy,是否有一个函数与二进制扩容相反?我希望从0和1的数组中删除“孤岛”。也就是说,如果2D数组中的值1没有至少1个相邻的也为1的邻居,则其值将设置为0(而不是将其邻居的值设置为1,如在二进制扩展中那样)。例如: test = np.zeros((5,5)) test[1,1] = test[1,2] = test[3,3] = test[4,3] = test[0,3] = test[3,1] = 1 test array([[0., 0., 0., 1., 0.], [0., 1.

是否有一个函数与二进制扩容相反?我希望从0和1的数组中删除“孤岛”。也就是说,如果2D数组中的值1没有至少1个相邻的也为1的邻居,则其值将设置为0(而不是将其邻居的值设置为1,如在
二进制扩展中那样)。例如:

test = np.zeros((5,5))
test[1,1] = test[1,2] = test[3,3] = test[4,3] = test[0,3] = test[3,1] = 1

test
array([[0., 0., 0., 1., 0.],
       [0., 1., 1., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 1., 0., 1., 0.],
       [0., 0., 0., 1., 0.]])
我正在寻找的函数将返回:

array([[0., 0., 0., 0., 0.],
       [0., 1., 1., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 1., 0.],
       [0., 0., 0., 1., 0.]])

请注意位置[0,3]和[3,1]中的值从1更改为0,因为它们没有值等于1的相邻邻域(对角线不算为相邻邻域)。

您可以使用单元格创建一个掩码以进行检查,并使用
test
进行二维卷积,以识别与其相邻的
1
单元格。卷积和
测试的逻辑and应产生所需的输出

首先定义你的面具。由于只查找上/下和左/右邻接,因此需要以下内容:

mask = np.ones((3, 3))
mask[1,1] = mask[0, 0] = mask[0, 2] = mask[2, 0] = mask[2, 2] = 0
print(mask)
#array([[0., 1., 0.],
#       [1., 0., 1.],
#       [0., 1., 0.]])
如果要包含对角线元素,只需更新
mask
即可在角点中包含
1
s

现在使用
掩码
应用
测试
的2d卷积。这将使两个矩阵的值相乘和相加。使用此掩码,将返回每个单元格的所有相邻值之和

from scipy.signal import convolve2d
print(convolve2d(test, mask, mode='same'))
#array([[0., 1., 2., 0., 1.],
#       [1., 1., 1., 2., 0.],
#       [0., 2., 1., 1., 0.],
#       [1., 0., 2., 1., 1.],
#       [0., 1., 1., 1., 1.]])
您必须指定
mode='same'
,以便结果与第一个输入的大小相同(
test
)。请注意,要从
test
中删除的两个单元格是卷积输出中的
0

最后,使用此输出和测试执行元素相关的
操作,以找到所需的单元格:

res = np.logical_and(convolve2d(test, mask, mode='same'), test).astype(int)
print(res)
#array([[0, 0, 0, 0, 0],
#       [0, 1, 1, 0, 0],
#       [0, 0, 0, 0, 0],
#       [0, 0, 0, 1, 0],
#       [0, 0, 0, 1, 0]])
更新

对于最后一步,您还可以只
剪裁
卷积中0和1之间的值,并执行元素级乘法

res = convolve2d(test, mask, mode='same').clip(0, 1)*test
#array([[0., 0., 0., 0., 0.],
#       [0., 1., 1., 0., 0.],
#       [0., 0., 0., 0., 0.],
#       [0., 0., 0., 1., 0.],
#       [0., 0., 0., 1., 0.]])

如上所述,这与二元侵蚀并不直接相似。实际上,您似乎在寻找一个过滤器,该过滤器查找连接的组件(仅正交连接,而不是对角线连接),并消除面积=1的组件。我将引导您的搜索转向“连接组件标签”。