试图理解掩蔽

Trying to understand masking

我一直在努力了解蒙版及其与图像滤镜的配合方式。我正在使用以下代码来加深我的理解。

import scipy.ndimage as ndi
import matplotlib.pyplot as plt
import numpy as np

#   Generate a random binary mask
np.random.seed(seed=182)
mask = np.random.randint(2, size=(901, 877))

img = np.random.rand(901, 877)

img_masked = np.ma.masked_array(img, mask = mask)
img_masked_filtered = ndi.median_filter(img_masked, size=10)
img_unmasked_filtered = ndi.median_filter(img, size=10)

median_masked = np.ma.median(img_masked)
median_unmasked = np.ma.median(img)

在结果中,median_unmasked != median_masked 如我所料,但 img_masked_filtered == img_unmasked_filtered 我不想要。 scipy.ndimage.median_filter 完全可以完成我需要的工作,但不适用于蒙版图像。我可以使用什么来做与中值滤波器相同的事情,但它适用于蒙版图像?

我为数组使用的奇怪大小是因为这是我最终要过滤的图像的大小。

ndimage 过滤器不考虑蒙版数组的蒙版。相反,"mask" 一个具有 nan 值的普通 NumPy 数组,然后使用 ndimage.generic_filter 调用 np.nanmedian:

import scipy.ndimage as ndi
import matplotlib.pyplot as plt
import numpy as np

np.random.seed(seed=182)
# h, w = 901, 877
h, w = 10, 10
mask = np.random.randint(2, size=(h, w))
img = np.random.rand(h, w)
img_masked = np.where(mask, img, np.nan)

size = 3
img_masked_median = ndi.generic_filter(img_masked, np.nanmedian, size=size)
img_unmasked_median = ndi.median_filter(img, size=size)

fig, ax = plt.subplots(nrows=2, ncols=2)
ax[0,0].imshow(img)
ax[0,0].set_title('img')
ax[0,1].imshow(img_masked)
ax[0,1].set_title('img_masked')
ax[1,0].imshow(img_unmasked_median)
ax[1,0].set_title('img_unmasked_median')
ax[1,1].imshow(img_masked_median)
ax[1,1].set_title('img_masked_median')
plt.show()