在 Numpy 数组中创建缓冲区
Create buffer zone within a Numpy array
我有一个二进制图像如下:
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]])
我该怎么做?
如果输入和输出数组中只有 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 和 0 以外的其他值,则需要多加考虑。
您也可以使用 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
正方形以每个像素为中心)。
我有一个二进制图像如下:
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]])
我该怎么做?
如果输入和输出数组中只有 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 和 0 以外的其他值,则需要多加考虑。
您也可以使用 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
正方形以每个像素为中心)。