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

标签 python image-processing filter scipy gaussian

我有一个灰度图像和该图像中 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 必须以浮点格式进行计算并返回浮点值图像。整数运算在这里不会做正确的事情。

<小时/>

这是一个例子:

enter image description here

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

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

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

关于Python:仅在图像蒙版内执行模糊,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59685140/

相关文章:

python - 正则表达式删除连字符和空格

python - 如何在 python 中运行非线性回归

python - 如何使用 pycurl 读取标题

matlab - 对于定向梯度的直方图,如何计算边缘像素的梯度向量?

java - 如何在java中将图像转换为棕褐色?

c# - 带有参数化 IN 子句的 FluentNHibernate 过滤器

javascript - 从 API 端点过滤对象数组

javascript - 如何使用React从Fantasy Premier League检索授权信息

python - SQLAlchemy 中的过滤关系

algorithm - 如何填充半径增加的圆?