文章目录
一、卷积核锐化
1、opencv函数:
void filter2D( InputArray src, OutputArray dst, int ddepth,
InputArray kernel, Point anchor = Point(-1,-1),
double delta = 0, int borderType = BORDER_DEFAULT );
2、参数说明:
- src:输入
- dst:输出
- ddepth:卷积之后图像的位深,即卷积之后图像的数据类型,一般设为-1,表示和原图像类型一致。
- kernel:卷积核大小,用元组或者ndarray表示,要求数据类型必须是float型。
- anchor:锚点,即卷积核的中心点,是可选参数,默认是(-1, -1)。
- delta:可选参数,表示卷积之后额外加的一个值,相当于线性方程中的偏差,默认是0。
- borderType:边界类型,一般不设置。
3、代码示例:
int main()
{
cv::Mat img = cv::imread("C:\\Users\\Administrator\\Downloads\\1.jpeg", IMREAD_GRAYSCALE);
cv::imshow("img", img);
cv::Mat img_filter;
float low[] = {0,-1,0,-1,5,-1,0,-1,0};
cv::Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
cv::filter2D(img, img_filter, -1, kernel);
cv::imshow("img_filter", img_filter);
cv::waitKey(0);
return 0;
}
4、效果图
二、方盒滤波和均值滤波
1.opencv函数
void boxFilter( InputArray src, OutputArray dst, int ddepth,
Size ksize, Point anchor = Point(-1,-1),
bool normalize = true,
int borderType = BORDER_DEFAULT );
2.函数说明
- src:输入
- dst:输出
- ddepth:卷积之后图像的位深,即卷积之后图像的数据类型,一般设为-1,表示和原图像类型一致。
- ksize:卷积核大小,比如:Size(3,3)
- anchor:锚点,即卷积核的中心点,是可选参数,默认是(-1, -1)。
- normalize :是否归一化,默认true
- borderType:边界类型,一般不设置。
卷积核形式
- 当 normalize = True 时,a = 1 / (W * H) 滤波器的宽高
- 当 normalize = False 时,a = 1
- 一般情况下都使用 normalize = True时,方盒滤波等价于均值滤波
3.代码示例
int main()
{
cv::Mat img = cv::imread("C:\\Users\\Administrator\\Downloads\\1.jpeg", IMREAD_GRAYSCALE);
//cv::imshow("img", img);
cv::Mat img_filter;
float low[] = {0,-1,0,-1,5,-1,0,-1,0};
cv::boxFilter(img, img_filter, -1, Size(3, 3));
//均值滤波
//cv::blur(img, img_filter, Size(3, 3));
cv::Mat img_cat;
cv::hconcat(img, img_filter, img_cat);
cv::imshow("img_cat", img_cat);
cv::waitKey(0);
return 0;
}
4.效果图
三、高斯滤波
1.高斯函数介绍
要理解高斯滤波首先要知道什么是高斯函数:
高斯函数是符合高斯分布(也叫正态分布)数据的概率密度函数。
高斯函数的特点是以x轴某一点(这一点称为均值)为对称轴,越靠近中心数据发生的概率越高,最终形成一个两边平缓,中间陡峭的钟型(也被称为帽子)图形。
高斯函数的一般形式为:
高斯滤波就是使用符合高斯分布的卷积核对图像进行卷积操作,所以高斯滤波的重点是如何计算符合高斯分布的卷积核,即高斯模板。
我们可以观察到越靠近中心,数值越大,越边缘的数值越小,符合高斯分布的特点。
通过高斯函数计算出来的是概率分布函数,所以我们还要确保这九个点加起来为1,这九个点的权重总和等于0.4787147,因此,上面九个值还要分别除以0.4787147,得到最终的高斯模板。
注:有些整数高斯模板是在归一化后的高斯模板的基础上每个数除以左上角的值,然后取整。
有了卷积核,计算高斯滤波就简单了。假设现在有9个像素点,灰度值(0 ~ 255)的高斯滤波计算如下:
将这9个值加起来,就是中心点的高斯滤波的值。对所有点重复这个过程,就得到了高斯模糊后的图像。
2. opencv函数
void GaussianBlur( InputArray src, OutputArray dst, Size ksize,
double sigmaX, double sigmaY = 0,
int borderType = BORDER_DEFAULT );
3.函数说明
- src:输入
- dst:输出
- ksize:高斯核的大小
- sigmaX:X轴的标准差
- sigmaY:Y轴的标准差,默认为0,这时 sigmaY = sigmaX
- 如果没有指定sigma值,则会分别从ksize的宽度和高度中计算sigma
选择不同的sigma值会得到不同的平滑效果,sigma越大,平滑效果越明显。
4.代码示例
int main()
{
cv::Mat img = cv::imread("C:\\Users\\Administrator\\Downloads\\1.jpeg", IMREAD_GRAYSCALE);
//cv::imshow("img", img);
cv::Mat img_filter;
float low[] = {0,-1,0,-1,5,-1,0,-1,0};
cv::GaussianBlur(img, img_filter, Size(3, 3), 1);
cv::Mat img_cat;
cv::hconcat(img, img_filter, img_cat);
cv::imshow("img_cat", img_cat);
cv::waitKey(0);
return 0;
}
5.效果图
四、中值滤波
中值滤波原理非常简单,假设有一个数组[1 5 5 6 7 8 9],取1其中的中间值(即中位数)作为卷积后的结果值即可。
中值滤波对胡椒噪音(也叫椒盐噪音)效果明显。
1 opencv函数
void medianBlur( InputArray src, OutputArray dst, int ksize );
2 参数说明
- src:输入
- dst:输出
- ksize:核大小,是个数字3,5,7…
3 代码示例
int main()
{
cv::Mat img = cv::imread("C:\\Users\\Administrator\\Downloads\\1.jpeg", IMREAD_GRAYSCALE);
//cv::imshow("img", img);
cv::Mat img_filter;
float low[] = {0,-1,0,-1,5,-1,0,-1,0};
cv::medianBlur(img, img_filter, 3);
cv::Mat img_cat;
cv::hconcat(img, img_filter, img_cat);
cv::imshow("img_cat", img_cat);
cv::waitKey(0);
return 0;
}
4 效果图
五、双边滤波
双边滤波对于图像的边缘信息能够更好的保存,其原理为一个与空间距离相关的高斯函数与一个灰度距离相关的高斯函数相乘。
空间距离:
指的是当前点与中心点的欧式距离。空间域高斯函数其数学形式为:
其中(xi,yi )为当前位置,(xc,yc)为中心点的位置,σ 为空间域标准差。
灰度距离:
指的是当前点灰度与中心点灰度的差的绝对值。值域高斯函数其数学形式为:
其中,gray(xi,yi )为当前点灰度值,gray(xc ,yc)为中心点灰度值,σ为值域标准差。
注意:双边滤波本质上是高斯滤波,不同的是:
1、双边滤波既利用了位置信息又利用了像素信息来定义滤波窗口的权重。
2、高斯滤波只利用了位置信息。
对于高斯滤波,仅用空间距离的权值系数核与图像卷积后,确定中心点的灰度值。即认为离中心点越近的点,其权重系数越大。
双边滤波中加入了对灰度信息的权重,即在邻域内,灰度值越接近中心点灰度值点的权重更大,灰度值相差大的点的权重越小。此权重大小,则由值域高斯函数确定。
两者权重系数相乘,得到最终的卷积模板。由于双边滤波需要每个中心点邻域的灰度信息来确定其系数,所以其速度比一般的滤波慢很多,而且计算量增长速度为核大小的平方。
1. opencv函数
void bilateralFilter( InputArray src, OutputArray dst, int d,
double sigmaColor, double sigmaSpace,
int borderType = BORDER_DEFAULT );
2. 参数说明
- src:输入
- dst:输出
- d:过滤期间使用的每个像素邻域的直径。 如果它是非正数,则从 sigmaSpace 计算。
- sigmaColor:计算像素信息使用的sigma
- sigmaSpace:计算空间信息使用的sigma
3. 代码示例
int main()
{
cv::Mat img = cv::imread("C:\\Users\\Administrator\\Downloads\\1.jpeg", IMREAD_GRAYSCALE);
//cv::imshow("img", img);
cv::Mat img_filter;
float low[] = {0,-1,0,-1,5,-1,0,-1,0};
cv::bilateralFilter(img, img_filter, 10, 20, 50);
cv::Mat img_cat;
cv::hconcat(img, img_filter, img_cat);
cv::imshow("img_cat", img_cat);
cv::waitKey(0);
return 0;
}
4. 效果图
六、总结
高斯滤波
高斯滤波是一种线性平滑滤波,对于服从正太分布的噪声非常有效。高斯滤波还有另一种说法高斯模糊,而这两种说法是有区别的,就是以滤波器是低通滤波器还是高通滤波器来区分的。比如低通滤波器,像素能量低的通过,而对于像素能量高的部分将会采取加权平均的方法重新计算像素的值,将能量像素的值编程能量较低的值,我们知道对于图像而言其高频部分展现图像细节,所以经过低通滤波器之后整幅图像变成低频造成图像模糊,这就被称为高斯模糊;相反高通滤波是允许高频通过而过滤掉低频,这样将低频像素进行锐化操作,图像变的更加清晰,被称为高斯滤波。说白了很简单就是:高斯滤波是指用高斯函数作为滤波函数的滤波操作而高斯模糊是用高斯低通滤波器。
高斯滤波在图像处理中常用来对图像进行预处理操作。
中值滤波
中值滤波对消除椒盐噪声非常有效,能够克服线性滤波器带来的图像细节模糊等弊端,能够有效保护图像边缘信息,是非常经典的平滑噪声处理方法。在光学测量条纹图像的香味分析处理方法中有特殊作用,但在条纹中心分析方法中作用不大。
中值滤波相较于线性滤波中的均值滤波优点在前面已经提到,取得良好滤波效果的代价就是耗时的提升,可能达到均值滤波的数倍,而且对于细节较多的图像也不太适用。
双边滤波
双边滤波器可以很好的保存图像边缘细节而滤除掉低频分量的噪音,但是双边滤波器的效率不是太高,花费的时间相较于其他滤波器而言也比较长。
参考链接:
https://blog.csdn.net/keith_bb/article/details/54427779
https://blog.csdn.net/m0_70885101/article/details/126315309