在前面学习了双边滤波,虽然实现保边平滑的效果,但是平滑效果有时候不如高斯平滑。那么有没有改进的方法呢?这里来回忆一下,前面双边滤波里,使用原图像的灰度相似度作为相似算法,是否可以从这里下手呢?其实是可以的。可以先对原图像进行高斯平滑,然后把这幅图像的灰度值作为计算相似度,替代双边滤波里的原图像相似度计算。把这种方法叫做联合双边滤波,双边滤波的公式如下:
根据联合双边滤波可以把公式改为这样:
这里可以看到灰度值计算方式发生了改变,它是从高斯平滑之后的图片里取值,是引入另外一幅图像,不是原始图像。在python里,要使用这个功能,需要安装opencv-contrib-python,如果原来已经安装opencv-python,要先删除再安装它,进行如下操作:
pip uninstall opencv-python (如果已经安装opencv-python包,先卸载)
pip install opencv-contrib-python
当安装成功之后,就可使用下面的例子来测试联合双边滤波:
#python 3.7.4,opencv4.1
#蔡军生 https://blog.csdn.net/caimouse/article/details/51749579
#
import cv2
import numpy as np
#图片的路径
imgname = "imgjbf.png"
#读取图片
image = cv2.imread(imgname, cv2.IMREAD_COLOR)
#图片的高度和宽度
h,w = image.shape[:2]
print('imagesize={}-{}'.format(w,h))
#显示原图
cv2.imshow("Image",image)
#平滑
joint = cv2.GaussianBlur(image,(33,33),3,3)
out = cv2.ximgproc.jointBilateralFilter(joint,image,-1,10,9)
#out = out.astype(np.uint8)
cv2.imshow("joint",joint)
cv2.imshow("out",out)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果输出如下:
输入原图
联合双边滤波后图片
高斯平滑后的图片
调用函数的定义:
joint: 进行联合滤波的导向图像,可以为单通道或多通道,保持边缘的滤波算法时常采用src
src: 输入图像对象矩阵,可以为单通道或多通道
d:用来计算卷积核的领域直径,如果d<0,从sigmaSpace计算d
sigmaColor:颜色空间滤波器标准偏差值,决定多少差值之内的像素会被计算(构建灰度值模板)
sigmaSpace:坐标空间中滤波器标准偏差值。如果d>0,设置不起作用,否则根据它来计算d值(构建距离权重模板)
https://blog.csdn.net/caimouse/article/details/51749579
转载:https://blog.csdn.net/caimouse/article/details/101209665