假设我有一个(m x n)2-d numpy数组,它们只是0和1。我想通过在阵列上运行例如3x3内核并获取该内核中的多数值来“平滑”阵列。对于边缘的值,我将忽略“丢失”的值。
例如,假设数组看起来像
import numpy as np
x = np.array([[1, 0, 0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 1, 1, 1, 1, 0],
[0, 0, 1, 1, 0, 1, 1, 0],
[0, 0, 1, 0, 1, 1, 1, 0],
[0, 1, 1, 1, 1, 0, 1, 0],
[0, 0, 1, 1, 1, 1, 1, 0],
[0, 0, 0, 0, 0, 0, 0, 0]])
从左上角的“ 1”开始,以左上角的第一个元素为中心的3 x 3内核将丢失第一行和第一列。我要处理的方式就是忽略它,并考虑剩下的2 x 2矩阵:
1 0
0 0
在这种情况下,多数值为0,因此将该元素设置为0。对所有元素重复此操作,我想要的结果二维数组将是:
0 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 1 1 1 1 1 0
0 0 1 1 1 1 1 0
0 0 1 1 1 1 1 0
0 0 1 1 1 1 0 0
0 0 0 0 0 0 0 0
我该如何完成?
您可以使用skimage.filters.rank.majority
为每个值分配在其附近出现最多的一个值。可以使用skimage.filters.rank.majority
定义3x3
内核:
skimage.morphology.square
注:您需要skimage.morphology.square
的最新稳定版本from skimage.filters.rank import majority
from skimage.morphology import square
majority(x.astype('uint8'), square(3))
array([[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 1, 1, 0, 0],
[0, 0, 1, 1, 1, 1, 1, 0],
[0, 0, 1, 1, 1, 1, 1, 0],
[0, 0, 1, 1, 1, 1, 1, 0],
[0, 0, 1, 1, 1, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0]], dtype=uint8)
。更多scikit-image