1.图像滤波的概述
(1)Why (为什么要进行图像滤波)
- 去噪:去除图像在获取、传输等过程中的各种噪音干扰
- 提取特征:使用特定的图像滤波器提取图像特定特征
(2)What (什么是图像滤波)
使用滤波核对图像进行卷积运算或非线性运算,以达到去噪或提取特征的目的的图像处理技术
2.线性滤波
What:对各像素灰度进行简单处理(乘以一个权重),最后求和
(1)方框滤波
归一化方框滤波器和均值滤波器的核基本一致,主要区别是:方框滤波器要进行归一化处理,如果不进行归一化处理,则表示的是方框滤波
在opencv中的滤波算法如下:
void cv::boxFilter(cv::Mat &imSrc, //输入图像
cv::Mat &imDst, //输出图像
int depth, //图像深度
cv::Size ssize, //方框滤波器的尺寸
cv::Point(-1,-1), //默认以中心点为基准
bool normalize = true, //是否进行归一化处理
int borderType = 4
);
(2)均值滤波
均值滤波器的核的元素全是1,并进行了归一化操作:即每个元素都会除以核的总数
void cv::blur(cv::Mat &imSrc, //输入图像
cv::Mat &imDst, //输出图像
cv::Size ksize, //滤波核的尺寸
Point anchor=Point(-1,-1), //默认以中心点为基准
int borderType=BORDER_DEFA //图像外部像素的边界模式,一般默认值即可
);
(3)高斯滤波
形状类似于概率论中的高斯分布模型(正态分布模型)
void cv::GaussianBlur(
cv::Mat &imSrc, //输入图像
cv::Mat &imDst, //输出图像
cv::Size ksize, //高斯滤波核的尺寸
double sigmaX, //高斯核函数在X方向的标准偏差
double sigmaY = 0, //高斯核函数在Y方向的标准偏差
int borderType = BORDER_DEFAULT
);
3.非线性滤波
(1)中值滤波
用像素点领域的灰度值来代替该像素点的灰度值,可以出去最大值和最小值,针对椒盐噪声效果很好
void cv::medianBlur(
cv::Mat &imSrc, //输入图像
cv::Mat &imDst, //输出图像
int ksize //中值滤波核的尺寸
);
(2)双边滤波
双边滤波能够在保持边缘的前提下实现降噪的目的,缺点是效率较慢
基本原理:考虑两个权重因素来组成卷积核
- 空域权重:两点之间的距离,距离越远权重越低
- 值域权重:两点之间的像素值相似程度,越相似权重越大。
void cv::bilalteralFilter(
cv::Mat &imSrc, //输入图像
cv::Mat &imDst, //输出图像
double sigmaColor, //值域的标准差
double sigmaSpace, //空间域的标准差
int borderType = BORDER_DEFAULT
);