给定一个2D数组和一个布尔掩码,我想将中值过滤器应用于仅处理由掩码指定的值的数组。
使用python的迭代编写此代码非常慢,这是可以预期的。我尝试将scipy的generic_filter
与numpy的nanmedian
结合使用,希望这是一种更有效的忽略值的方法,但事实证明它更慢。
from scipy.ndimage.filters import generic_filter
def median_filter(img, mask, size):
masked_img = img.copy()
masked_img[~mask] = np.nan
masked_img = generic_filter(masked_img, np.nanmedian, size, mode='reflect')
masked_img[~mask] = img[~mask]
return masked_img
skimage.filters.rank.median
是一种有效的实现,但是不幸的是,即使输入数组为uint8
,也将值转换为float
范围。