OpenCV——双边滤波

前面学习的一些滤波方法会是的图像边缘信息变弱或者消失,因此需要一种能够对图像边缘信息进行保留的滤波算法,双边滤波就是经典的常用的能够保留图像边缘信息的滤波算法之一。双边滤波是一种综合考虑滤波器内图像空域信息和滤波器内图像像素灰度值相似性的滤波算法,可以实现在保留区域信息的基础上实现对噪声的去除、对局部边缘的平滑。双边滤波对高频率的波动信号起到平滑的作用,同时保留大幅值的信号波动,进而实现对保留图像中边缘信息的作用。双边滤波的示意图如图所示,双边滤波器是两个滤波器的结合,分别考虑空域信息和值域信息,使得滤波器对边缘附近的像素进行滤波时,距离边缘较远的像素值不会对边缘上的像素值影响太多,进而保留了边缘的清晰性。

在这里插入图片描述

双边滤波原理的数学表示

在这里插入图片描述 

其中ω(i,j,k,l)为加权系数,其取值决定于空域滤波器和值域滤波器的乘积,空域滤波器的表示形式如式所示,值域表示形式如式所示。 

在这里插入图片描述

在这里插入图片描述在这里插入图片描述 

OpenCV 提供了对图像进行双边滤波操作的bilateralFilter()函数

void bilateralFilter( InputArray src, OutputArray dst, int d,
                                   double sigmaColor, double sigmaSpace,
                                   int borderType = BORDER_DEFAULT );
  • src:待双边滤波图像,图像数据类型为必须是CV_8U、CV_32F和CV_64F三者之一,并且通道数必须为单通道或者三通道。
  • dst:双边滤波后的图像,尺寸和数据类型与输入图像src相同。
  • d:滤波过程中每个像素邻域的直径,如果这个值是非正数,则由第五个参数sigmaSpace计算得到。
  • sigmaColor:颜色空间滤波器的标准差值,这个参数越大表明该像素领域内有越多的颜色被混合到一起,产生较大的半相等颜色区域。
  • sigmaSpace:空间坐标中滤波器的标准差值,这个参数越大表明越远的像素会相互影响,从而使更大领域中有足够相似的颜色获取相同的颜色。当第三个参数d大于0时,邻域范围由d确定,当第三个参数小于等于0时,邻域范围正比于这个参数的数值。
  • borderType:像素外推法选择标志,取值范围在表3-5中给出,默认参数为BORDER_DEFAULT,表示不包含边界值倒序填充。

该函数可以对图像进行双边滤波处理,在减少噪声的同时保持边缘的清晰。该函数第一个参数是待进行双边滤波的图像,该函数要求只能输入单通道的灰度图和三通道的彩色图像,并且对于图像的数据类型也有严格的要求,必须是CV_8U、CV_32F和CV_64F三者之一。函数第三个参数是滤波器的直径,当滤波器的直径大于5时,函数的运行速度会变慢,因此如果需要在实时系统中使用该函数,建议将滤波器的半径设置为5,对于离线处理含有大量噪声的滤波图像时,可以将滤波器的半径设为9,当滤波器半径为非正数的时候,会根据空间滤波器的标准差计算滤波器的直径。函数第四个和第五个参数是两个滤波器的标准差值,为了简单起见可以将两个参数设置成相同的数值,当他们小于10时,滤波器对图像的滤波作用较弱,当他们大于150时滤波效果会非常的强烈,使图像看起来具有卡通的效果。该函数运行时间比其他滤波方法时间要长,因此在实际工程中使用的时候,选择合适的参数十分重要。另外比较有趣的现象是,使用双边滤波会具有美颜效果。

 网上找了张图片试了下果然有美颜效果

 

 简单示例

//
// Created by smallflyfly on 2021/6/15.
//

#include "opencv2/opencv.hpp"
#include "opencv2/highgui.hpp"
#include "utils.hpp"

#include <iostream>

using namespace std;
using namespace cv;

int main() {

    Mat im = imread("test3.jfif");
    if (im.empty()) {
        cerr << "image file read error" << endl;
        return -1;
    }
//    resize(im, im, Size(0, 0), 0.5, 0.5);

    Mat im1;
    bilateralFilter(im, im1, 9, 40, 40);

    showImage("im", im);
    showImage("im1", im1);

    waitKey(0);
    destroyAllWindows();

    return 0;
}

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值