小言_互联网的博客

在OpenCV里实现联合双边滤波

573人阅读  评论(0)

在前面学习了双边滤波,虽然实现保边平滑的效果,但是平滑效果有时候不如高斯平滑。那么有没有改进的方法呢?这里来回忆一下,前面双边滤波里,使用原图像的灰度相似度作为相似算法,是否可以从这里下手呢?其实是可以的。可以先对原图像进行高斯平滑,然后把这幅图像的灰度值作为计算相似度,替代双边滤波里的原图像相似度计算。把这种方法叫做联合双边滤波,双边滤波的公式如下:

根据联合双边滤波可以把公式改为这样:

这里可以看到灰度值计算方式发生了改变,它是从高斯平滑之后的图片里取值,是引入另外一幅图像,不是原始图像。在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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场