如何溶解 numpy 数组中的模式?
How do I dissolve a pattern in a numpy array?
对不起,奇怪的标题,我真的想不出合适的措辞。
假设我有一个像这样的数组:
arr = [[0 1 1 1 1 1 1 1 0],
[0 0 1 1 1 1 1 0 0],
[0 0 0 1 1 1 0 0 0],
[0 0 0 0 1 0 0 0 0],
[0 0 0 0 0 0 0 0 0]]
我希望 "etch" 远离接触 0
的 1
,这将导致:
arr = [[0 0 1 1 1 1 1 0 0],
[0 0 0 1 1 1 0 0 0],
[0 0 0 0 1 0 0 0 0],
[0 0 0 0 0 0 0 0 0],
[0 0 0 0 0 0 0 0 0]] .
我尝试了一些类似 np.roll
的东西,但它似乎效率低下(并且有边缘效应)。有没有一个很好的简短方法来做到这一点?
考虑使用十字形内核进行卷积。
import numpy as np
from scipy.signal import convolve2d
kernel = np.array([[0,1,0], [1,1,1], [0,1,0]])
mask = convolve2d(arr, kernel, boundary='symm', mode='same')
arr[mask!=5] = 0
此方法适用于所有输入:
In [143]: D = np.random.random_integers(0,1, (5,5))
In [144]: D2 = D.copy()
In [145]: mask = convolve2d(D, kernel, boundary='symm', mode='same')
In [146]: D2[mask!=5] = 0
In [147]: binary_erosion(D, kernel2, border_value=1).astype(int)
Out[147]:
array([[0, 1, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]])
In [148]: D2
Out[148]:
array([[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]])
In [149]: D
Out[149]:
array([[1, 0, 1, 1, 1],
[0, 1, 0, 1, 0],
[0, 1, 0, 1, 0],
[0, 0, 1, 1, 0],
[1, 0, 1, 0, 0]])
In [150]: kernel
Out[150]:
array([[0, 1, 0],
[1, 1, 1],
[0, 1, 0]])
In [151]: kernel2
Out[151]:
array([[0, 1, 0],
[1, 0, 1],
[0, 1, 0]])
看看角落里的不同之处。
这里可以使用
形态侵蚀将 (i, j) 处的像素设置为以 (i, j) 为中心的邻域中所有像素的最小值。 source
data
Out[39]:
array([[0, 1, 1, 1, 1, 1, 1, 1, 0],
[0, 0, 1, 1, 1, 1, 1, 0, 0],
[0, 0, 0, 1, 1, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0]])
structure
Out[40]:
array([[0, 1, 0],
[1, 1, 1],
[0, 1, 0]])
eroded = binary_erosion(data, structure, border_value=1).astype(int)
eroded
Out[42]:
array([[0, 0, 1, 1, 1, 1, 1, 0, 0],
[0, 0, 0, 1, 1, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0]])
对不起,奇怪的标题,我真的想不出合适的措辞。
假设我有一个像这样的数组:
arr = [[0 1 1 1 1 1 1 1 0],
[0 0 1 1 1 1 1 0 0],
[0 0 0 1 1 1 0 0 0],
[0 0 0 0 1 0 0 0 0],
[0 0 0 0 0 0 0 0 0]]
我希望 "etch" 远离接触 0
的 1
,这将导致:
arr = [[0 0 1 1 1 1 1 0 0],
[0 0 0 1 1 1 0 0 0],
[0 0 0 0 1 0 0 0 0],
[0 0 0 0 0 0 0 0 0],
[0 0 0 0 0 0 0 0 0]] .
我尝试了一些类似 np.roll
的东西,但它似乎效率低下(并且有边缘效应)。有没有一个很好的简短方法来做到这一点?
考虑使用十字形内核进行卷积。
import numpy as np
from scipy.signal import convolve2d
kernel = np.array([[0,1,0], [1,1,1], [0,1,0]])
mask = convolve2d(arr, kernel, boundary='symm', mode='same')
arr[mask!=5] = 0
此方法适用于所有输入:
In [143]: D = np.random.random_integers(0,1, (5,5))
In [144]: D2 = D.copy()
In [145]: mask = convolve2d(D, kernel, boundary='symm', mode='same')
In [146]: D2[mask!=5] = 0
In [147]: binary_erosion(D, kernel2, border_value=1).astype(int)
Out[147]:
array([[0, 1, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]])
In [148]: D2
Out[148]:
array([[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]])
In [149]: D
Out[149]:
array([[1, 0, 1, 1, 1],
[0, 1, 0, 1, 0],
[0, 1, 0, 1, 0],
[0, 0, 1, 1, 0],
[1, 0, 1, 0, 0]])
In [150]: kernel
Out[150]:
array([[0, 1, 0],
[1, 1, 1],
[0, 1, 0]])
In [151]: kernel2
Out[151]:
array([[0, 1, 0],
[1, 0, 1],
[0, 1, 0]])
看看角落里的不同之处。
形态侵蚀将 (i, j) 处的像素设置为以 (i, j) 为中心的邻域中所有像素的最小值。 source
data
Out[39]:
array([[0, 1, 1, 1, 1, 1, 1, 1, 0],
[0, 0, 1, 1, 1, 1, 1, 0, 0],
[0, 0, 0, 1, 1, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0]])
structure
Out[40]:
array([[0, 1, 0],
[1, 1, 1],
[0, 1, 0]])
eroded = binary_erosion(data, structure, border_value=1).astype(int)
eroded
Out[42]:
array([[0, 0, 1, 1, 1, 1, 1, 0, 0],
[0, 0, 0, 1, 1, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0]])