首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:只在图像掩码内执行模糊操作

Python:只在图像掩码内执行模糊操作
EN

Stack Overflow用户
提问于 2020-01-10 16:05:40
回答 2查看 2.9K关注 0票数 3

我有一个灰度图像和一个二值掩码的ROI在该图像。我想在灰度图像上执行模糊操作,但只在面具的范围内。现在,我正在模糊整个图像,不只是删除遮罩外的项目,但我不希望像素以外的掩码影响我的投资回报。有没有办法做到这一点,而不构建一个自定义模糊功能?

希望有这样的事情:

代码语言:javascript
复制
import scipy
blurredImage = scipy.ndimage.filters.gaussian_filter(img, sigma = 3, weight = myMask)

@stefan:

代码语言:javascript
复制
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

扩张法:

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-10 16:56:41

将线性滤波器应用于有限域的正确方法是使用归一化卷积。该方法计算(加权)每个邻域内的像素数,然后用该邻域内的(加权)像素数进行归一化。它只使用过滤器的两个应用程序和一些微不足道的每个像素操作就可以做到这一点:

代码语言:javascript
复制
# 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必须以浮点格式进行计算,并返回浮点值图像.整数运算在这里不会做正确的事情。

下面是一个例子:

  • 第二张图片:普通过滤,然后移除面具外的东西。这表明掩码外的数据会影响滤波的结果。
  • 第三张图片:普通过滤,但设置在遮罩外的东西,首先为零。这表明掩码外的零点会影响过滤的结果。
  • 第四幅图像:使用归一化卷积:蒙面区域外的数据根本不影响滤波。
票数 7
EN

Stack Overflow用户

发布于 2020-01-10 16:56:33

你愿意达到的目标是不安的,没有你想象的那么明确。

模糊运算对应于每个像素邻域内像素的一些(各向同性)平均值。但是在域的边界附近,邻居是不完整的,您需要修复它。

  • 通过局部重新定义滤波器系数,以避免“查询”外部像素;一个简单的方法是在这些像素上将滤波器权重设置为零;或
  • 通过外推ROI以外的像素值。这样做应该避免沿边界的不连续,例如通过泊松重建。

对于第一种方法,您可以按照以下方式劫持标准过滤器:

  • 将外部像素设置为0并模糊整个图像;当滤波器跨过轮廓时,只会得到内部权重和内部像素的组合;
  • 将内部像素设置为1并模糊图像,您将只得到内部权重之和;
  • 取两个模糊图像的比率,使权重被正确地重新规范化。

如果图像是整数类型,则使用255而不是1来保持足够的精度。注意,在ROI之外,这些比率将有一个零分母。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59685140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档