Python:仅在图像蒙版内执行模糊

2023-12-30

我有一个灰度图像和该图像中 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)

将线性滤波器应用于有限域的正确方法是使用归一化卷积 http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/PIRODDI1/NormConv/NormConv.html。该方法计算每个邻域内的(加权)均值,然后通过该邻域中存在的(加权)像素数进行归一化。它仅使用过滤器的两个应用程序和一些简单的每像素操作来实现此目的:

# normalized convolution of image with mask
filter = scipy.ndimage.gaussian_filter(img * mask, sigma = blur)
weights = scipy.ndimage.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必须以浮点格式进行计算并返回浮点值图像。整数运算在这里不会做正确的事情。


这是一个例子:

  • 第二张图:普通过滤,然后去除掩模外面的东西。这说明掩码之外的数据影响了过滤的结果。

  • 第三张图:普通过滤,但首先将掩码之外的内容设置为零。这表明掩模外的零点影响了滤波的结果。

  • 第四张图:使用归一化卷积:屏蔽区域之外的数据完全不影响过滤。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python:仅在图像蒙版内执行模糊 的相关文章

随机推荐