【1】引言
前序学习过程中,已经掌握了对图像的基本滤波操作技巧,具体的图像滤波方式包括均值滤波、中值滤波和高斯滤波,相关文章链接有:
python学opencv|读取图像(五十四)使用cv2.blur()函数实现图像像素均值处理-CSDN博客
python学opencv|读取图像(五十五)使用cv2.medianBlur()函数实现图像像素中值滤波处理-CSDN博客
python学opencv|读取图像(五十六)使用cv2.GaussianBlur()函数实现图像像素高斯滤波处理-CSDN博客
进过前序文章的实践探索,随着像素核的增大,实际的滤波效果都出现了图像模糊的情形,因此,有必要继续探索新的滤波方式。
这就是本次文章的学习目的:掌握双边滤波函数cv.bilateralFilter()。
双边滤波函数cv.bilateralFilter()的工作原理为:在图像的中心区域,采用类似高斯滤波的方式处理,在图像的边缘区域,加大边缘区域像素点的权重,以保证图像的清晰度。
【2】官网教程
点击下方链接,直达双边滤波函数cv.bilateralFilter()的官网教程:
OpenCV: Image Filtering
官网页面对双边滤波函数cv.bilateralFilter()的说明为:
图1 官网页面对双边滤波函数cv.bilateralFilter()的说明
官网页面对双边滤波函数cv.bilateralFilter()的参数说明为:
void cv::bilateralFilter (
InputArray src, #输入图像
OutputArray dst, #输出图像
int d, #像素核直径
double sigmaColor, #像素点颜色值和周围颜色值差值小于此值时进行滤波
double sigmaSpace, #像素坐标开关,值越大,参与计算的像素点越多
int borderType = BORDER_DEFAULT ) #边界样式,可选参数
【3】代码测试
首先是引入模块和相关图像:
import cv2 as cv # 引入CV模块
# 读取图片
srcm = cv.imread('srcx.png') # 读取图像srcx.png
然后是对图像进行双边滤波处理:
#滤波计算
src1 = cv.bilateralFilter(srcm,3,180,200) # 图像取平均值,像素核大小为(3,3)
src2 = cv.bilateralFilter(srcm,5,180,200) # 图像取平均值,像素核大小为(5,5)
src3 = cv.bilateralFilter(srcm,7,180,200) # 图像取平均值,像素核大小为(7,7)
之后显示图像:
# 显示结果
cv.imshow('srcm ', srcm)
cv.imshow('src1 ', src1)
cv.imshow('src2 ', src2)
cv.imshow('src3 ', src3)
cv.imwrite('src1b.png',src1)
cv.imwrite('src2b.png',src2)
cv.imwrite('src3b.png',src3)
# 窗口控制
cv.waitKey() # 图像不关闭
cv.destroyAllWindows() # 释放所有窗口
程序运行使用的相关图像为:
图2 初始图像scrx.png
图3 双边滤波图像scr1.png
图3 双边滤波图像scr2.png
图3 双边滤波图像scr3.png
由图2至图5可见,双边滤波函数cv.bilateralFilter()处理后的图像,随着像素核的增大,虽然也出现了模糊的效果,但模糊的程度较小,较大程度保证了图像的清晰度。
【4】细节说明
调用cv2.bilateralFilter()滤波函数进行双边滤波时,给出的是像素核直径。
而其他三种滤波方式不一样:
调用cv2.medianBlur()函数进行中值滤波时,使用的像素核只需要写出边长n,但这个边长也应该是奇数,cv2.medianBlur()函数会自动根据这个边长划定一个正方形的像素核。
调用cv2.blur()函数进行均值滤波和调用cv2.GaussianBlur()函数进行高斯滤波处理时,均需要给出(nXn)大小的像素核,这个n应使用奇数。
像素核使用奇数大小会比较好,是因为奇数大小会在最中间围成一个方格,这个方格就是核心方格,滤波计算的值直接赋给这个核心方格。
图6 图像滤波技术对比
【5】总结
掌握了使用python+opencv实现调用cv2.bilateralFilter()函数进行双边滤波处理图像的技巧。