opencv学习(七)图像模糊(滤波)

模糊操作时图像处理中最简单和常用的操作之一,图像模糊的作用是给图像预处理时减低噪声。 
使用模糊操作的背后是数学的卷积计算: 

$$g(i,j) = \sum_{k,l}f(i+k,j+l)*h(k,l)$$

其中权重核h(k,l)为“滤波系数”。上面的式子可以简记为: 

$$g = f\bigotimes h$$

通常这些卷积算子计算都是线性操作,所以又叫线性滤波。

常见的线性滤波包括:均值滤波、高斯滤波

均值滤波(归一化滤波)

       均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标像素为中心的周围8个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。

当我们用3*3的模板进行均值滤波时,

这里写图片描述

 由于图像边框上的像素无法被模板覆盖,所以不做处理。 这当然造成了图像边缘的缺失 

 以(2,2)像素点为例:

这里写图片描述

则滤波后的结果为: 

$$g(2,2)=int (\frac{1}{9}*(1+2+1+1+10+2+5+2+6))=3$$

滤波后(2,2)像素点的值由 10 变为 3。最终结果: 

这里写图片描述

OpenCV提供均值滤波API:

blur(Mat src,Mat dst, Size ksize, Point anchor)
第三个参数:一般写成Size(w,h),表示内核的大小,w为像素宽度,h为像素高度
第四个参数:Point类型的anchor,表示锚点(被平滑的那个点),默认值为Point(-1,-1),表示锚点在核的中心

实例代码:

//进行均值滤波
blur(src,dest,Size(11,11)); 
namedWindow("均值滤波【处理后】",CV_WINDOW_AUTOSIZE);
imshow("均值滤波【处理后】",dest);

对于椒盐噪声,效果如下:

这里写图片描述

 

高斯滤波

       高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。

       从数学角度说就是图像与正态分布做卷积,正态分布又叫高斯分布,所以这项技术就叫做高斯模糊。

OpenCV提供API:

GaussianBlur(src, dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT)
第三个参数,Size类型的ksize高斯内核的大小,其中ksize.width和ksize.height可以不同,但必须为奇数
第四个参数,表示高斯函数在X方向的标准差。
第五个参数,表示高斯函数在Y方向的标准差。

实例代码:

  //进行高斯滤波
GaussianBlur(src,dest,Size(7,7),3,3);
namedWindow("高斯滤波【处理后】",CV_WINDOW_AUTOSIZE);
imshow("高斯滤波【处理后】",dest);

效果图:

这里写图片描述

常见的非线性滤波为:中值滤波、双边滤波

中值滤波 

       核心思想是用像素点领域灰度值的中值来代替该像素点的灰度值,该方法在去除脉冲噪声、椒盐噪声的同时又能保留图像的边缘细节。

用 3×3 大小模板进行中值滤波,以(2,2)像素点为例:

这里写图片描述

对模板中的 9 个数进行从小到大排序:1,1,1,2,2,5,6,6,10。中间值为 2.所有,中值滤波后(2,2)位置的值变为 2. 同理对其他像素点。 处理结果:

这里写图片描述

OpenCV提供中值滤波API:

void medianBlur(InputArray src, OutputArray dst, int ksize)
第三个参数:int类型的ksize,孔径的线性尺寸,这个参数必须是大于1的奇数

代码演示:

//进行中值滤波
medianBlur(src,dest,3);
namedWindow("中值滤波【处理后】",CV_WINDOW_AUTOSIZE);
imshow("中值滤波【处理后】",dest);

 效果图:

这里写图片描述

 

双边滤波

    双边滤波是结合图像的空间邻近度和像素值相似度的一种折中处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。

  • 均值模糊无法克服边缘像素信息丢失缺陷。原因是均值模糊是基于平均权重。
  • 高斯模糊部分克服了该缺陷,但是无法完全避免,因为没考虑到像素值的不同。
  • 双边滤波是保留边缘的滤波方法,避免了边缘信息的丢失,保留了图像轮廓不变。

OpenCV提供的API:

bilateralFilter(src, dst, int d, double sigmaColor, double sigmaSpace, int borderType=BORDER_DEFAULT)
第三个参数,过滤过程中每个像素领域的直径
第四个参数,颜色空间滤波器的sigma值。这个参数值越大,表示该像素领域内有越宽广的颜色会被混合到一起
第五个参数,坐标空间中滤波器的sigma值,坐标空间的标注方差,它的值越大,意味着越远的像素会相互影响

实现代码:

    //进行双边滤波
    bilateralFilter(src,dest,15,150,3);
    namedWindow("双边滤波【处理后】",CV_WINDOW_AUTOSIZE);
    imshow("双边滤波【处理后】",dest);

    //增强对比度
    Mat result = Mat::zeros(dest.size(),dest.type());
    Mat kernel = (Mat_<char>(3,3)<<0,-1,0,-1,5,-1,0,-1,0);
    filter2D(dest,result,dest.depth(),kernel);
    namedWindow("最终结果",CV_WINDOW_AUTOSIZE);
    imshow("最终结果",result);

效果图:

这里写图片描述

猜你喜欢

转载自blog.csdn.net/lhm_19960601/article/details/82533134