Сглаживание 2-D Numpy массива с ядром - PullRequest
1 голос
/ 14 апреля 2020

Предположим, у меня есть массив (mxn) 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», a Ядро 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

Как мне выполнить sh это?

Ответы [ 2 ]

2 голосов
/ 14 апреля 2020

Вы можете использовать skimage.filters.rank.majority, чтобы присвоить каждому значению наиболее часто встречающееся значение в его окрестности. Ядро 3x3 можно определить с помощью 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 за majority. Подробнее здесь

...