Использование view_as_windows и numpy.ma.median на замаскированном изображении

Я пытаюсь отфильтровать изображение так, чтобы значение каждого пикселя было равно значению медианы пикселей в квадрате 50x50 вокруг него, исключая любые замаскированные пиксели. Это моя последняя попытка:

  1. Прочтите изображение из файла FITS (выглядит так ...)  введите описание изображения здесь
  2. Применить маску из другого файла FITS
  3. Передайте окно 50x50 пикселей (я думаю, что это лучший способ сделать это ... открыт для предложений) через замаскированное изображение (замаскированное изображение ниже)  введите описание изображения здесь
  4. Создайте отфильтрованную копию замаскированного изображения со значением каждого пикселя, равным значению медианы пикселей в квадрате 50x50 вокруг него, исключая любые замаскированные пиксели.

В приведенном здесь коде я использовал некоторые методы из документации skimage.util.view_as_windows для создания отфильтрованного изображения: введите описание изображения здесь

Мне кажется, что он игнорирует замаскированные пиксели. У меня двоякий вопрос: это лучший способ сделать это? Если да, то почему похоже, что маска игнорируется?

import numpy as np
from astropy.io import fits
from skimage.util.shape import view_as_windows

#   Use the fits files as input image and mask
hdulist = fits.open('xbulge-w1.fits')
image = hdulist[0].data
hdulist3 = fits.open('xbulge-mask.fits')
mask = 1 - hdulist3[0].data
imagemasked = np.ma.masked_array(image, mask = mask)

side = 50
window_shape = (side, side)

Afiltered = view_as_windows(imagemasked, window_shape)

# collapse the last two dimensions in one
flatten_view = Afiltered.reshape(Afiltered.shape[0], Afiltered.shape[1], -1)

# resampling the image by taking median
median_view = np.ma.median(flatten_view, axis=2)

Примечание. Использование «side = 50» приводит к довольно длительному времени выполнения, поэтому для целей тестирования я старался уменьшить его, скажем, до 10–25.


person Jim421616    schedule 23.08.2017    source источник
comment
skimage не поддерживает маскирование, github.com/scikit-image/ scikit-image / issues /   -  person pd shah    schedule 23.08.2017


Ответы (1)


в python есть много фильтров с различным поведением по nan, например, для среднего фильтра:

x=np.array([[0.1,0.8,.2],
            [0.5,0.2,np.nan],
            [0.7,0.2,0.9],
            [0.4,0.7,1],
            [np.nan,0.14,1]])

print(uniform_filter(x, size=3, mode='constant'))

[[ 0.17777778         nan         nan]
 [ 0.27777778         nan         nan]
 [ 0.3                nan         nan]
 [        nan         nan         nan]
 [        nan         nan         nan]]

or

from skimage.filters.rank import mean
from skimage.morphology import square
from skimage import img_as_float
x=np.array([[0.1,0.8,.2],
        [0.5,0.2,np.nan],
        [0.7,0.2,0.9],
        [0.4,0.7,1],
        [np.nan,0.14,1]])

print(mean(x, square(3)))

[[102  76  76]
 [106 102  97]
 [114 130 127]
 [ 90 142 167]
 [ 79 137 181]]

print(img_as_float(mean(x, square(3))))

[[ 0.4         0.29803922  0.29803922]
 [ 0.41568627  0.4         0.38039216]
 [ 0.44705882  0.50980392  0.49803922]
 [ 0.35294118  0.55686275  0.65490196]
 [ 0.30980392  0.5372549   0.70980392]]

доза skimage не поддерживает наносы и маскировку: ссылка или

import numpy as np
# from scipy.signal import convolve
from scipy.signal import convolve2d

x=np.array([[0.1,0.8,.2],
            [0.5,0.2,np.nan],
            [0.7,0.2,0.9],
            [0.4,0.7,1],
            [np.nan,0.14,1]])

core = np.full((3,3),1/3**2)

# convolve(x, core, mode='same')
convolve2d(x, core, mode='same')

[[ 0.17777778         nan         nan]
 [ 0.27777778         nan         nan]
 [ 0.3                nan         nan]
 [        nan         nan  0.43777778]
 [        nan         nan  0.31555556]]
person pd shah    schedule 23.08.2017
comment
Я перепробовал так много разных перестановок, что у меня сложилось четкое впечатление, что эта задача невозможна с использованием Python. Можно ли это сделать с помощью существующих модулей и пакетов? Или мне надо написать свой ??? может мне стоит изучать информатику, а не астрономию :( - person Jim421616; 24.08.2017