首页 > 解决方案 > 仅在边缘应用高斯滤波器

问题描述

在此处输入图像描述

我有一个二进制蒙版,如何在蒙版的边界上应用标准单位偏差的高斯核来平滑边界?

标签: filtercv2gaussianmedical-imaging

解决方案


在蒙版上应用高斯模糊滤镜时,它仅模糊蒙版的边界。

例子:

import cv2
orig_img = cv2.imread('mask.png', cv2.IMREAD_GRAYSCALE)  # Read image as Grayscale.
blur = cv2.GaussianBlur(orig_img, (15, 15), 0)

结果:
在此处输入图像描述


如果您想保持遮罩不变,并且只平滑遮罩周围的像素,我建议使用少量迭代,并取最大值。

获取原始图像和模糊图像之间的最大值,确保原始蒙版像素保持不变,因为它们的值是 255(最大可能值)。

这是一个代码示例:

import cv2

orig_img = cv2.imread('mask.png', cv2.IMREAD_GRAYSCALE)  # Read image as Grayscale.

img = orig_img.copy()
for i in range(10):
    blur = cv2.GaussianBlur(img, (15, 15), 0)
    img = cv2.max(blur, img)  # Getting the maximum in order to mask the margins brighter

blur = cv2.max(orig_img, img)  # Getting the maximum for keeping the original mask pixels unmodified.

cv2.imshow('blur', blur)
cv2.waitKey()
cv2.destroyAllWindows()

结果:
在此处输入图像描述


另一种选择是在之前使用形态膨胀GaussianBlur

import cv2

orig_img = cv2.imread('mask.png', cv2.IMREAD_GRAYSCALE)  # Read image as Grayscale.

img = cv2.dilate(orig_img, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7, 7)))

blur = cv2.GaussianBlur(img, (15, 15), 0)

blur = cv2.max(blur, orig_img)  # Getting the maximum for keeping the original mask pixels unmodified.

cv2.imshow('blur', blur)
cv2.waitKey()
cv2.destroyAllWindows()

结果:
在此处输入图像描述


推荐阅读