我的二进制图像如下:
data = np.array([[0, 0 , 0 , 0 , 0 , 0 , 0 , 0],
[0, 0 , 0 , 0 , 0 , 0 , 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 , 0 , 0 , 0 , 0 , 0 , 0],
[0, 0 , 0 , 0 , 0 , 0 , 0 , 0]])
对于具有1s值的像素,我想制作两个像素的缓冲区,其值为1s,每四个方向被包围。预期结果将是:
result=np.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]])
我该怎么做?
答案 0 :(得分:2)
如果输入和输出数组上只有1和0,则可以使用2D卷积来完成,这很简单且有效。
from scipy.signal import convolve2d
data = np.array([[0, 0 , 0 , 0 , 0 , 0 , 0 , 0],
[0, 0 , 0 , 0 , 0 , 0 , 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 , 0 , 0 , 0 , 0 , 0 , 0],
[0, 0 , 0 , 0 , 0 , 0 , 0 , 0]])
# the kernel doesn't need to be ones, it just needs to be positive and
# non-zero.
kernel = np.ones((5, 5))
result = np.int64(convolve2d(data, kernel, mode='same') > 0)
它可以为您提供所需的输出。您需要在边缘定义要发生的内容 - 在此版本中,输出数组与输入数组的大小相同。
如果你有一个稀疏数组,你可能会做得更快。
如果你的数组中有其他值而不是1,则需要更多考虑。
答案 1 :(得分:1)
您也可以使用morphological dilation
运算符(在这种情况下扩展ones
)来执行此操作。
from skimage.morphology import square, dilation
data = np.array([[0, 0 , 0 , 0 , 0 , 0 , 0 , 0],
[0, 0 , 0 , 0 , 0 , 0 , 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 , 0 , 0 , 0 , 0 , 0 , 0],
[0, 0 , 0 , 0 , 0 , 0 , 0 , 0]])
result = dilation(data, square(5))
请注意,在这种情况下,square(5)
相当于np.ones((5,5))
。扩张运算符的工作原理是扩展True
或1
像素,并将元素作为第二个参数传递(在这种情况下,以每个像素为中心的5x5
方格)。