我有一个灰度图像和一个二进制掩模的ROI在图像。我想在灰度图像上执行模糊操作,但只能在遮罩的范围内。现在,我正在模糊整个图像,而不仅仅是去除遮罩之外的项目,但我不希望遮罩之外的像素影响我的ROI。有没有一种方法可以做到这一点,而无需建立自定义模糊功能?
希望能有这样的东西:
import scipy
blurredImage = scipy.ndimage.filters.gaussian_filter(img, sigma = 3, weight = myMask)
字符串
@stefan:
blur = 3
invmask = np.logical_not(mask).astype(int)
masked = img * mask
remaining = img * invmask
blurred = scipy.ndimage.filters.gaussian_filter(masked, sigma = blur)
blurred = blurred+remaining
型
扩张入路:
blur = 3
invmask = np.logical_not(mask).astype(int)
masked = img * mask
masked2 = scipy.ndimage.morphology.grey_dilation(masked,size=(5,5))
masked2 = masked2 *invmask
masked2 = masked + masked2
blurred = scipy.ndimage.filters.gaussian_filter(masked2, sigma = blur)
型
2条答案
按热度按时间vc9ivgsu1#
将线性滤波器应用于有限域的正确方法是使用Normalized Convolution。该方法计算每个邻域内的(加权)均值,然后通过该邻域中存在的(加权)像素数进行归一化。它只使用滤波器的两个应用程序和一些琐碎的每像素操作来实现:
字符串
请注意,
mask
不需要仅为0和1,它可以包含中间值,表明您对该像素值的正确性有多“确定”。但通常情况下,0表示“缺失数据”,1表示可用数据。gaussian_filter
必须以浮点格式进行计算,并返回浮点值图像。整数运算在这里不会做正确的事情。下面是一个例子:
的数据
bmvo0sr52#
你想要达到的目标是不容易的,也没有你想象的那么明确。
模糊操作对应于每个像素的邻域中的像素的一些(各向同性)平均。但是在域的边界附近,邻域是不完整的,您也需要修复它
对于第一种方法,您可以劫持标准过滤器,如下所示:
如果图像是整数类型,则使用255而不是1以保持足够的精度。注意,在ROI之外,比率将具有零分母。