Opencv2系列学习笔记8(图像滤波)

一:概念:

滤波是信号处理机图像处理中的一个基本操作。滤波去除图像中的噪声,提取感兴趣的特征,允许图像重采样。

图像中的频域和空域:空间域指用图像的灰度值来描述一幅图像;而频域指用图像灰度值的变化来描述一幅图像。而低通滤波器和高通滤波器的概念就是在频域中产生的。

低通滤波器指去除图像中的高频成分,而高通滤波器指去除图像中的低频成分。

后面将介绍低通滤波器—均值和高斯滤波器;中值滤波器—非线性滤波器;高通滤波器—sobel算子(方向滤波器)和拉普拉斯变换(二阶导数)。其中利用方向滤波器和拉普拉斯变换可以对图像的边缘进行检测。

二:低通滤波器

<1>cv::blur函数:每个像素替换为相邻矩形内像素的平均值

<2>cv::GaussianBlur函数:通过高斯核来进行替换

Code:

[cpp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. Mat result;                              // 线性平滑 滤波  每个像素替换为相邻矩形内像素的平均值  
  2.     blur(image, result,Size(5,5));         // filter2D可以自定义核进行线性滤波  
  3.   
  4.     Mat gauResult;  
  5.     GaussianBlur(image, gauResult, Size(5,5), 1.5);    // 高斯平滑 模糊  线性滤波器  

Result:

sourceImage:

BlurResult:


GaussianBlur:


低通滤波器的效果是对图像进行模糊和平滑,减弱了物体边缘可见的快速变化。它是一种线性滤波器,原理是与核进行卷积运算,此时的核内定,当我们需要指定核函数进行卷积时可以用filter2D函数,它的使用见blog:http://blog.csdn.net/lu597203933/article/details/16811851。 

三:中值滤波器

中值滤波器是非线性滤波器,它的原理是仅仅计算这组数的中值,并用中值替换当前的像素值。因此对于去除椒盐噪点非常有用。

Code:

[cpp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. Mat medianResult;  
  2.     medianBlur(image, medianResult,5);  // 是一个非线性的滤波器,利用中值替换当前的像素值,对于去除椒盐噪点尤为有用  

Result:

 

三:方向滤波器—sobel算子

Sobel算子就是通过卷积操作来计算图像的一阶导数,由于边缘处图像灰度变化率较大,因此可以用sobel算子来进行边缘检测。Sobel算子的核定义为:

y坐标轴:


x坐标轴:


Sobel函数:Sobel(InputArray src, OutputArray dst, int ddepth,

                         int dx, int dy, int ksize=3,

                         doublescale=1, double delta=0,

                         int borderType=BORDER_DEFAULT );

其中ddepth为图像类型, (dx,dy) = (1,0)为x方向导数,(dx,dy) = (0,1)为y方向导数,scale和delta的作用是再保存前可以对图像进行缩放,公式为:dst =dst * scale + delta.

Code:

[cpp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. int main()  
  2. {  
  3.     Mat image = imread("F:\\lena.png", 0);  
  4.     if(!image.data)  
  5.     {  
  6.         cout << "Fail to load image" << endl;  
  7.         return 0;  
  8.     }  
  9.     Mat sobel_x, sobel_y;  
  10.     //Sobel(image, sobel_x, CV_8U, 1, 0, 3, 0.4, 128);  
  11.     //Sobel(image, sobel_y, CV_8U, 0, 1, 3, 0.4, 128);  
  12.   
  13.     Sobel(image, sobel_x, CV_16S, 1, 0);  // 因为后面要相加 所以用16位有符号的整数来表示  另外导数肯定含有负数  
  14.     Sobel(image, sobel_y, CV_16S, 0, 1);  
  15.     Mat sobel;  
  16.     sobel = abs(sobel_x) + abs(sobel_y);  
  17.   
  18.     double sobmin, sobmax;  
  19.     minMaxLoc(sobel, &sobmin, &sobmax);  
  20.     Mat sobelImage;  
  21.     sobel.convertTo(sobelImage, CV_8U, -255.0/sobmax, 255);   // 等价于  saturate_cast(a*sobel + b)  
  22.       
  23.     Mat sobelThresholded;  
  24.     int thre = 200;  
  25.     threshold(sobelImage, sobelThresholded, thre, 255, THRESH_BINARY);  
  26.   
  27.     namedWindow("sobelImage", 0);  
  28.     imshow("sobelImage", sobelImage);  
  29.     namedWindow("sobelThresholded", 0);  
  30.     imshow("sobelThresholded", sobelThresholded);  
  31.   
  32.     waitKey(0);  
  33.     return 0;  
  34. }  

Result:


当然除了sobel算子,还有其它的算子,如Scharr算子,它更精确、快。它的核为:

 

Sobel(image, sobelX, CV_16S, 1, 0,CV_SCHARR);

或者:

Scharr(image, scharrX, CV_16S, 1, 0, 3);

四:拉普拉斯变换

拉普拉斯变化时基于图像导数的高通滤波器,计算二阶导数以衡量图像的弯曲度

Code:

[cpp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. int main()  
  2. {  
  3.     Mat image = imread("F:\\lena.png", 0);  
  4.     if(!image.data)  
  5.     {  
  6.         cout << "Fail to load image" << endl;  
  7.         return 0;  
  8.     }  
  9.     Mat laplacian;  
  10.     Laplacian(image, laplacian, CV_16S, 3);  // 二阶导数肯定含有负数。。  基于图像导数的高通滤波器,计算二阶导数以衡量图像的弯曲度  
  11.     laplacian = abs(laplacian);  
  12.     Mat laplacianImage;  
  13.     laplacian.convertTo(laplacianImage, CV_8U);  
  14.     namedWindow("laplacianImage");  
  15.     imshow("laplacianImage", laplacianImage);  
  16.     waitKey(0);  
  17.     return 0;  
  18.   
  19. }  

Result:


作者:小村长  出处:http://blog.csdn.net/lu597203933 欢迎转载或分享,但请务必声明文章出处。 (新浪微博:小村长zack, 欢迎交流!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值