概述
图像的模糊是图像处理中比较常用和简单的处理手段之一。那么使用这种手段的原因就是为了给图像进行去噪,便于后面的处理。
模糊处理的背后的原理是什么呢,其实就是卷积计算。而在高等数学里面,卷积是连续的,在图像处理中,我们所说的卷积是离散的。直接来上图你就清楚了卷积是怎么回事。
你看是不是我们之前讲的图像的掩模很相似。简单的说,拿一个小方格在图像这个方格上进行滑动,其实这个和深度学习里面的卷积是差不多的原理。这样我们就可以得到一个新的图像了。
所以你看,不同类型的模糊处理背后其实是对应不同的小方格,也就是俗称的滤波器或者卷积核。
根据原理的不同,模糊方式有很多种,我们来介绍比较常用的几种。
1、均值滤波。(blur)
均值滤波从字面意思上就是取平均值,也就是黄色小方格上的系数全是1,与黄色窗体覆盖下的像素值相乘,再去除以9(卷积和大小为3*3),得到平均值,赋值给中心像素。
它的 缺点是在去噪的同时,不能很好的保留图像细节,因为全用均值代替了。
2、高斯滤波。
相对于均值滤波,更好的保留图像的细节。因为高斯函数的特性,会有一定的权重配比。
3、中值滤波。
字面意思的话,就是取中间的值来代替中心像素。和均值滤波类似,只不过均值滤波是取平均值,中值滤波取中间的那个值。中值滤波可以有效的去除椒盐噪声(比如说你在清水中,撒点盐,这些就是椒盐噪声。对应到图像上,在一副黑色图像上,有很多小白点,这些就是椒盐噪声)。
那么它为什么可以去除椒盐噪声呢。因为椒盐噪声像素值要么很小为0,要么很大为255,而取中间值话,就会用替代这些,从而给图像去噪点。
4、双边滤波。
那之前我们说过高斯滤波相对于均值模糊而言保留图像的一些细节,但是它是基于空阈的,就是基于空间分布的。但是它还是没有办法完全避免边缘信息的丢失。而双边滤波则是比高斯滤波多了一个高斯方差sigma-d,所以在边缘附近,离的较远的像素不会太多影响到边缘上的像素值,这样就保证了边缘附近像素值的保存。也就是说它们的像素值在设定落差之外,不给它进行模糊,比便于保留边缘。
下面就是代码实现。
1、均值滤波:
Mat src=imread("D:\test1.jpg");
if(src.empty())
{
qDebug()<<"fail to load";
return;
}
Mat blurDst;
blur(src,blurDst,Size(3,3));
imshow("blurDst",blurDst);
imshow("src",src);
waitKey(-1);
结果如下:
是不是感觉明显变得模糊了吧。
2、高斯滤波。
Mat src=imread("D:\test1.jpg");
if(src.empty())
{
qDebug()<<"fail to load";
return;
}
Mat blurDst;
GaussianBlur(src,blurDst,Size(3,3),11,11);
imshow("GaussianDst",blurDst);
imshow("src",src);
waitKey(-1);
结果如下:
3、椒盐滤波。
Mat src=imread("D:\test2.png");
if(src.empty())
{
qDebug()<<"fail to load";
return;
}
Mat blurDst;
medianBlur(src,blurDst,3);
imshow("medianDst",blurDst);
imshow("src",src);
waitKey(-1);
结果如下:
我们可以看到,去掉了一些噪声,当然我们还可以调一下size的大小,看看效果。
4、双边滤波。
Mat src=imread("D:\test2.png");
if(src.empty())
{
qDebug()<<"fail to load";
return;
}
Mat blurDst;
bilateralFilter(src,blurDst,15,100,3);
imshow("bilateralDst",blurDst);
imshow("src",src);
waitKey(-1);
结果如下:
总结:
均值滤波无法克服边缘像素信息丢失的缺陷,原因是均值滤波是基于平均权重。
高斯滤波虽然克服了均值滤波的缺陷,但是无法完全避免,因为没有考虑像素值得不同,只是基于空间分布考虑。
双边滤波避免了边缘信息丢失,保留了图像的轮廓不变。
最后
以上就是靓丽刺猬为你收集整理的opencv基础(五)图像的模糊处理的全部内容,希望文章能够帮你解决opencv基础(五)图像的模糊处理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复