两种常用的方法

  • 高斯双边
  • 均值迁移

高斯双边滤波

前文提到的高斯模糊只考虑了像素空间的分布,而没有考虑差异问题。下图十分形象的说明了边缘保留滤波的原理。一张黑白分明存在噪声的图片通过高斯滤波保留边缘将二者区分开来。

代码解析

# 边缘保留滤波(EPF)
# 高斯双边滤波

def bilateral_demo(img):
    dst = cv.bilateralFilter(src=img, d=0, sigmaColor=100, sigmaSpace=15)
    ''' 高斯双边模糊,相当于磨皮操作 src:原图像 d: 像素的领域直径,可由sigmaColor和sigmaColor计算得到 sigmaColor: 颜色空间的标准方差,一般越大越好 sigmaSpace: 坐标空间的标准方差(像素单位),一般越小越好 '''
    cv.imshow('bilateal_dome', dst)
    kennel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32)  # 锐化操作使图像更立体
    dst1 = cv.filter2D(dst, -1, kennel)  # -1 表示和原图一样
    cv.imshow('sharpening_dome', dst1)

image = cv.imread('./data/face.png', 1)
cv.imshow('source image', image)
bilateral_demo(image)
cv.waitKey(0)
cv.destroyAllWindows()


而用高斯模糊的结果是:

2.均值偏移滤波

# 均值偏移滤波
def mean_shift_demo(img):
    dst = cv.pyrMeanShiftFiltering(src=img, sp=15, sr=20)
    ''' 均值偏移滤波处理,想当与把图片转油画的操作 src: 原图像 sp:空间窗的半径(The spatial window radius) sr: 色彩窗的半径(The color window radius) 通过均值迁移来进行边缘保留滤波有时会导致图像过度模糊 '''
    cv.imshow('mean_shift_demo', dst)

image = cv.imread('./data/face.png', 1)
cv.imshow('source image', image)
mean_shift_demo(image)
cv.waitKey(0)
cv.destroyAllWindows()