我正在执行图像分析并以布尔值的形式生成种子array:
import numpy as np
# Example output array
a = np.array([[False, False, False], [False, True, False], [False, False, False]])
>>> a
array([[False, False, False],
[False, True, False],
[False, False, False]])
Run Code Online (Sandbox Code Playgroud)
由于我想对值周围的区域进行后续分析True,因此我想将其扩展(按一定数量,例如像素)。这将导致以下结果:
>>> a
array([[False, True, False],
[True, True, True],
[False, True, False]])
Run Code Online (Sandbox Code Playgroud)
有没有任何function简单的方法可以解决我的“径向扩展”问题?
预先感谢,BBQuercus
为什么不简单地使用scipy.ndimage.binary_dilation?
import numpy as np
from scipy import ndimage
a = np.array([
[False, False, False],
[False, True, False],
[False, False, False],
])
b = ndimage.binary_dilation(a, [
[False, True, False],
[ True, True, True],
[False, True, False],
])
Run Code Online (Sandbox Code Playgroud)
结果:
>>> a
array([[False, False, False],
[False, True, False],
[False, False, False]])
>>> b
array([[False, True, False],
[ True, True, True],
[False, True, False]])
Run Code Online (Sandbox Code Playgroud)
scipy.signal.convolve2d的解决方案:
import numpy as np
from scipy.signal import convolve2d
# Example input
# [[False False False False False]
# [False False True True False]
# [False False False False False]
# [False False False False False]
# [False False False False True]]
in_array = np.zeros((5, 5), dtype=bool)
in_array[1,2] = True
in_array[1,3] = True
in_array[4,4] = True
# Kernel: here you should define how much the True "dilates"
kernel = np.asarray([[False, True, False],
[True, True, True],
[False, True, False]])
# Convolution happens here
# Convolution is not possible for bool values though, so we convert to int and
# back. That works because bool(N) == True if N != 0.
result = convolve2d(in_array.astype(int), kernel.astype(int), mode='same').astype(bool)
print(result)
# Result:
# [[False False True True False]
# [False True True True True]
# [False False True True False]
# [False False False False True]
# [False False False True True]]
Run Code Online (Sandbox Code Playgroud)