OpenCV图像处理开发实战(7) -- 图像平滑/模糊处理

1、前言

(1) 图像平滑处理的目的

在图像的获取和传输过程中原始图像会受到各种噪声的干扰,使图像质量下降。所以要对图像进行平滑处理消除噪声。 噪声消除的方法又可以分为空间域或频率域,亦可以分为全局处理或局部处 理,亦可以按线性平滑、非线性平滑和自适应平滑来区别。
减少噪声的方法可以在空间域或频率域进行处理, 主要有邻域平均法、 中值滤波法、低通滤波法等,邻域平均法即通过提高信噪比,取得较好的平滑效 果; 空间域低通滤波采用低通滤波的方法去除噪声;以及频域低通滤波法通过除 去其高频分量就能去掉噪声,从而使图像平滑。

(2) 图像平滑处理的数学运行

graph(i,j) = sigma((f(i+k, j+i)*h(k,i))
h(k,i)是卷积算子或称掩膜。
线性操作的卷积算子称线性滤波。

大多数线性滤波器具有低通特性,去除噪声的同时也使图像的边缘变模糊。

非线性滤波器如中值滤波,在一定程度上可以克服线性滤波器所带来的图像模糊问题,在滤除噪声的同时,较好地保留了图像的边缘信息。

2、图像平滑处理函数

(1) blur函数
void blur( InputArray src,
OutputArray dst,
Size ksize, // 核(算子)的大小,长宽不一定要相等,必须是正数且必须是奇数,
Point anchor = Point(-1,-1), // 中心点
int borderType = BORDER_DEFAULT // 边界像素的处理办法
);

enum BorderTypes {
    BORDER_CONSTANT    = 0, //!< `iiiiii|abcdefgh|iiiiiii`  with some specified `i`
    BORDER_REPLICATE   = 1, //!< `aaaaaa|abcdefgh|hhhhhhh`
    BORDER_REFLECT     = 2, //!< `fedcba|abcdefgh|hgfedcb`
    BORDER_WRAP        = 3, //!< `cdefgh|abcdefgh|abcdefg`
    BORDER_REFLECT_101 = 4, //!< `gfedcb|abcdefgh|gfedcba`
    BORDER_TRANSPARENT = 5, //!< `uvwxyz|abcdefgh|ijklmno`

    BORDER_REFLECT101  = BORDER_REFLECT_101, //!< same as BORDER_REFLECT_101
    BORDER_DEFAULT     = BORDER_REFLECT_101, //!< same as BORDER_REFLECT_101
    BORDER_ISOLATED    = 16 //!< do not look outside of ROI
};

(2) GaussuanBlur函数
高斯滤波器是空间滤波器,一种平滑线性滤波器,高斯滤波器是带有权重的平均值,即加权平均,中心的权重比邻近像素的权重更大,这样就可以克服边界效应。

void GaussianBlur( InputArray src,
OutputArray dst,
Size ksize, // 核(算子)的大小,长宽不一定要相等,必须是正数且必须是奇数,
double sigmaX, // 算子在X方向上的标准差
double sigmaY = 0,// 算子在Y方向上的标准差,设0时,跟sigmaX相同;若二者都为0, 根据核宽度来计算。
int borderType = BORDER_DEFAULT );

(3) 中值滤波 medianBlur函数
中值滤波器是一种统计滤波器,属于非线性的的空间滤波器。它是将像素(中值计算中包括的原像素值)邻域内灰度的中值代替该像素的值。对于一定类型的随机噪声,很好的去噪能力,比小尺寸的线性平滑滤波器的模糊程度明显要低。中值滤波器对处理脉冲噪声非常有效。

void medianBlur( InputArray src,
OutputArray dst,
int ksize // 必须大于1,且是奇数
)

(4) 双边滤波 bilateralFilter 函数
双边滤波是一种非线性滤波器,它可以达到保持边缘、降噪平滑的效果。双边滤波采用加权平均的方法,用周边像素亮度值的加权平均代表某个像素的强度,所用的加权平均基于高斯分布。最重要的是,双边滤波的权重不仅考虑了像素的欧氏距离(如普通的高斯低通滤波,只考虑了位置对中心像素的影响),还考虑了像素范围域中的辐射差异(例如卷积核中像素与中心像素之间相似程度、颜色强度,深度距离等)

void bilateralFilter(InputArray src,
OutputArray dst,
int d, // 像素邻近像素的个数(直径)
double sigmaColor, // 颜色空间中的Filter sigma, sigmaColor值越大, 越远的像素的颜色会影响到本像素的计算,只要颜色值足够近。
double sigmaSpace,// 坐标空间的Filter sigma, sigmaSpace越大,越远的像素会影响到本像素的计算,只要颜色值足够近。
int borderType = BORDER_DEFAULT );

3、运行效果图

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

4、工程项目源代码下载

本文源代码下Debug–x64下编译运行
Zip包中包含开发环境,可以直接编译运行。

下载源代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值