
我有一个二进制掩码,如何将高斯核的标准单位偏差应用在掩码的边框上以平滑边界?
发布于 2021-06-07 15:50:22
在掩模上应用高斯模糊滤波器时,只会模糊掩码的边界。
示例:
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()结果:

https://stackoverflow.com/questions/67872163
复制相似问题