Python: создать маску с неизвестной формой - PullRequest
1 голос
/ 08 апреля 2020

Я пытаюсь извлечь маску с "неизвестной" формой. Я объясню себя лучше:

Мои исходные данные состоят из матрицы с NaN, которые более или менее окружают истинные данные. Я использовал оператор sobel для определения края:

#data is a matrix with Nan
mask = np.isnan(data)
data[mask] = 0
data[~mask] = 1 
out = sobel(data) #sobel is a function that returns the gradient

sobel output

На рисунке показан результат операции sobel. Поскольку исходные данные также содержат NaN среди истинных данных, оператор sobel обнаруживает внутренние границы. Я хочу попробовать метод, чтобы обнаружить только внешние края (фигура, которая выглядит как ромб). Учтите, что может изменяться не только эта форма (это может быть квадрат или прямоугольник), но также может меняться и положение (т. Е. Может быть децентрировано или очень мало по отношению к размеру изображения). В результате я получу маску со всем внешним пикселем, установленным в значение «Истина» (или «Ложь»), а для всех внутренних пикселей будет установлено значение «Ложь» (или «Истина»).

Спасибо!

1 Ответ

1 голос
/ 08 апреля 2020

Возможное, частичное решение - использование операции opening, определяемой как эрозия с последующим расширением. Я использовал тот, который предоставлен skimage:

from skimage.morphology import opening
#data has shape shape_1, shape_2
mask_data = np.ones((shape_1, shape_2), dtype=bool)
mask = np.isnan(data)
mask_data[_mask] = 0
mask_data = opening(mask_data).astype(bool)

Такой метод возвращает что-то похожее на то, что я ищу. Как видно из рисунка, на самом деле это оставляет некоторые черные внутренние точки, но это лучшее, что я нашел.

enter image description here

...