我的二进制图像如下:
data = np.array([[1, 1 , 1 , 1 , 1 , 1 , 1 , 1],
[1, 1 , 1 , 1 , 1 , 1 , 1 , 1],
[1, 1 , 0 , 0 , 0 , 0 , 1 , 1],
[1, 1 , 0 , 0 , 0 , 0 , 1 , 1],
[1, 1 , 0 , 0 , 0 , 0 , 1 , 1],
[1, 1 , 1 , 1 , 1 , 1 , 1 , 1],
[1, 1 , 1 , 1 , 1 , 1 , 1 , 1]])
对于具有0s值的像素,我想仅向南方向延伸2个像素。 预期结果将是:
result = np.array([[1, 1 , 1 , 1 , 1 , 1 , 1 , 1],
[1, 1 , 1 , 1 , 1 , 1 , 1 , 1],
[1, 1 , 0 , 0 , 0 , 0 , 1 , 1],
[1, 1 , 0 , 0 , 0 , 0 , 1 , 1],
[1, 1 , 0 , 0 , 0 , 0 , 1 , 1],
[1, 1 , 0 , 0 , 0 , 0 , 1 , 1],
[1, 1 , 0 , 0 , 0 , 0 , 1 , 1]])
我该怎么做?
我在下面看到了相关的问题和答案:
Create buffer zone within a Numpy array
result = np.int64(convolve2d(data, np.ones((5, 5)), mode='same') > 0)
但是,我想只朝一个方向卷入
答案 0 :(得分:4)
使用scipy.ndimage.binary_erosion()
:
from scipy import ndimage
data = np.array([[1, 1 , 1 , 1 , 1 , 1 , 0 , 1],
[1, 1 , 1 , 1 , 1 , 1 , 1 , 1],
[1, 1 , 0 , 0 , 0 , 0 , 1 , 0],
[0, 1 , 0 , 0 , 0 , 0 , 1 , 1],
[1, 1 , 0 , 0 , 0 , 0 , 0 , 1],
[1, 1 , 1 , 1 , 1 , 1 , 1 , 1],
[1, 1 , 1 , 1 , 1 , 1 , 1 , 1]])
kernel = [[1], [1], [1], [0], [0]]
ndimage.binary_erosion(data, kernel, border_value=1).astype(np.uint8)