用内核平滑二维Numpy数组

问题描述 投票:1回答:1

假设我有一个(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

我该如何完成?

python numpy convolution
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.