Open CV系列学习笔记(七)边缘保留滤波(EPF)
高斯双边
双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折中处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。具有简单、非迭代、局部的特点 。双边滤波器的好处是可以做边缘保存(edge preserving),一般过去用的维纳滤波或者高斯滤波去降噪,都会较明显地模糊边缘,对于高频细节的保护效果并不明显。
双边滤波器顾名思义比高斯滤波多了一个高斯方差sigma-d,它是基于空间分布的高斯滤波函数,所以在边缘附近,离的较远的像素不会太多影响到边缘上的像素值,这样就保证了边缘附近像素值的保存。但是由于保存了过多的高频信息,对于彩色图像里的高频噪声,双边滤波器不能够干净的滤掉,只能够对于低频信息进行较好的滤波。
代码:
def bi_demo(image):#高斯双边
dst = cv.bilateralFilter(image,0,100,15)
cv.imshow("bi_demo",dst)
结果:
均值迁移
均值迁移模糊是图像边缘保留滤波算法中一种,经常用来在对图像进行分水岭分割之前去噪声,可以大幅度提升分水岭分割的效果。它的基本原理是:
对于给定的一定数量样本,任选其中一个样本,以该样本为中心点划定一个圆形区域,求取该圆形区域内样本的质心,即密度最大处的点,再以该点为中心继续执行上述迭代过程,直至最终收敛。
可以利用均值偏移算法的这个特性,实现彩色图像分割,Opencv中对应的函数是pyrMeanShiftFiltering。
这个函数严格来说并不是图像的分割,而是图像在色彩层面的平滑滤波,它可以中和色彩分布相近的颜色,平滑色彩细节,侵蚀掉面积较小的颜色区域。
代码:
def shift_demo(image):#均值迁移
dst = cv.pyrMeanShiftFiltering(image,10,50)
cv.imshow("shift_demo",dst)
结果:
完整代码:
import cv2 as cv
import numpy as np
def bi_demo(image):#高斯双边 边缘保留(美颜滤镜^_^)
dst = cv.bilateralFilter(image,0,100,15)
cv.imshow("bi_demo",dst)
def shift_demo(image):#均值迁移
dst = cv.pyrMeanShiftFiltering(image,10,50)
cv.imshow("shift_demo",dst)
print("--------HEllow Python-------")
src = cv.imread("E:/picture/04.jpg")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)
shift_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()