我一直在试图了解掩蔽和它如何与图像过滤器工作。我正在使用下面的代码来开发我的理解。
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)
结果中,中位数被揭穿了!=中位数屏蔽,正如我所料,但img_屏蔽过滤==img_未屏蔽过滤,这是我不想要的。scipy.ndimage.median_filter确实完成了我需要的工作,但它不适用于蒙面图像我能用什么来做和中值滤波一样的事情,但是哪一个可以在蒙版图像上工作呢?
我对数组使用的奇怪大小是因为这是我最终要过滤的图像的大小。
最佳答案
ndimage过滤器不尊重屏蔽数组的掩码。取而代之的是,使用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()