2015-03-13 148 views
1

内创建缓冲区我有一个二进制图像,如下所示:一个numpy的阵列

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]]) 

对于具有1秒的值的像素,我想使两个像素与在每一个四个方向包围值的1的缓冲区。预期结果如下:

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

它是只有一个和零的数组,还是有其他值? – 2015-03-13 08:39:30

+0

是的,它只是1s和0s – Borys 2015-03-13 09:41:24

回答

2

如果你只有输入和输出阵列上的1和0可以用一个二维卷积,这是简单的工作做。

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和0的其他值,将需要更多的思考。

+0

为什么你需要“一个积极的和非零的内核”?我看不到任何理由,文档也没有提到这个(http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.convolve2d.html)。 – EOL 2015-03-13 08:51:54

+1

你不需要'convolve2d',但是你需要为方法工作(特别是'> 0')。 – 2015-03-13 09:13:57

+0

@HenryGomersall感谢您的回答。你能解释一下为什么你使用了(5,5)的内核。 – Borys 2015-03-13 09:53:51

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))在这种情况下。膨胀运算器通过扩大True1像素的作用,使用作为第二参数传递的元素(在这种情况下,以每个像素为中心的5x5平方)。