我有一个灰度图像和该图像中 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)
最佳答案
将线性滤波器应用于有限域的正确方法是使用 Normalized Convolution 。该方法计算每个邻域内的(加权)平均值,然后通过该邻域中存在的(加权)像素数进行归一化。它仅使用过滤器的两个应用程序和一些简单的每像素操作来实现此目的:
# normalized convolution of image with mask
filter = scipy.ndimage.filters.gaussian_filter(img * mask, sigma = blur)
weights = scipy.ndimage.filters.gaussian_filter(mask, sigma = blur)
filter /= weights
# after normalized convolution, you can choose to delete any data outside the mask:
filter *= mask
请注意,mask
不需要只是 0 和 1,它可以包含中间值,指示您对该像素值的正确性有多“确定”。但通常情况下,“缺失数据”为 0,可用数据为 1。
gaussian_filter
必须以浮点格式进行计算并返回浮点值图像。整数运算在这里不会做正确的事情。
这是一个例子:
第二张图片:普通过滤,然后去除 mask 之外的东西。这说明掩码之外的数据影响了过滤的结果。
第三张图片:普通过滤,但首先将掩码之外的内容设置为零。这说明掩码之外的零点影响了滤波的结果。
第四张图:使用归一化卷积:屏蔽区域之外的数据完全不影响过滤。
关于Python:仅在图像蒙版内执行模糊,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59685140/