一:概念:

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

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

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

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

二:低通滤波器

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

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

Code:

Mat result;                              // 线性平滑 滤波  每个像素替换为相邻矩形内像素的平均值
blur(image, result,Size(5,5)); // filter2D可以自定义核进行线性滤波 Mat gauResult;
GaussianBlur(image, gauResult, Size(5,5), 1.5); // 高斯平滑 模糊 线性滤波器

Result:

sourceImage:

BlurResult:

GaussianBlur:

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

三:中值滤波器

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

Code:

Mat medianResult;
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:

int main()
{
Mat image = imread("F:\\lena.png", 0);
if(!image.data)
{
cout << "Fail to load image" << endl;
return 0;
}
Mat sobel_x, sobel_y;
//Sobel(image, sobel_x, CV_8U, 1, 0, 3, 0.4, 128);
//Sobel(image, sobel_y, CV_8U, 0, 1, 3, 0.4, 128); Sobel(image, sobel_x, CV_16S, 1, 0); // 因为后面要相加 所以用16位有符号的整数来表示 另外导数肯定含有负数
Sobel(image, sobel_y, CV_16S, 0, 1);
Mat sobel;
sobel = abs(sobel_x) + abs(sobel_y); double sobmin, sobmax;
minMaxLoc(sobel, &sobmin, &sobmax);
Mat sobelImage;
sobel.convertTo(sobelImage, CV_8U, -255.0/sobmax, 255); // 等价于 saturate_cast(a*sobel + b) Mat sobelThresholded;
int thre = 200;
threshold(sobelImage, sobelThresholded, thre, 255, THRESH_BINARY); namedWindow("sobelImage", 0);
imshow("sobelImage", sobelImage);
namedWindow("sobelThresholded", 0);
imshow("sobelThresholded", sobelThresholded); waitKey(0);
return 0;
}

Result:

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

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

或者:

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

四:拉普拉斯变换

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

Code:

int main()
{
Mat image = imread("F:\\lena.png", 0);
if(!image.data)
{
cout << "Fail to load image" << endl;
return 0;
}
Mat laplacian;
Laplacian(image, laplacian, CV_16S, 3); // 二阶导数肯定含有负数。。 基于图像导数的高通滤波器,计算二阶导数以衡量图像的弯曲度
laplacian = abs(laplacian);
Mat laplacianImage;
laplacian.convertTo(laplacianImage, CV_8U);
namedWindow("laplacianImage");
imshow("laplacianImage", laplacianImage);
waitKey(0);
return 0; }

Result:

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

Opencv2系列学习笔记8(图像滤波)的更多相关文章

  1. Opencv2系列学习笔记2(图像的其它操作)

    本节主要涉及到图像的领域.算术操作以及如何操作图像感兴趣的区域. 一:邻域操作 以下例子主要对图像进行锐化.基于拉普拉斯算子<后面讨论>.这幅图像的边缘部分将得到放大,细节部分将更加的锐利 ...

  2. Opencv2系列学习笔记10(提取连通区域轮廓)

    连通区域指的是二值图像中相连像素组成的形状.而内.外轮廓的概念及opencv1中如何提取二值图像的轮廓见我的这篇博客:http://blog.csdn.net/lu597203933/article/ ...

  3. Opencv2系列学习笔记10(提取连通区域轮廓) 另一个

    http://blog.csdn.net/lu597203933/article/details/17362457 连通区域指的是二值图像中相连像素组成的形状.而内.外轮廓的概念及opencv1中如何 ...

  4. Python下opencv使用笔记(图像频域滤波与傅里叶变换)

    Python下opencv使用笔记(图像频域滤波与傅里叶变换) 转载一只程序喵 最后发布于2018-04-06 19:07:26 阅读数 1654  收藏 展开 本文转载自  https://blog ...

  5. OpenCV成长之路:图像滤波

    http://ronny.blog.51cto.com/8801997/1394138 OpenCV成长之路:图像滤波 2014-04-11 14:28:44 标签:opencv 边缘检测 sobel ...

  6. opencv学习之路(12)、图像滤波

    一.图像滤波简介 二.方框滤波——boxFilter() #include<opencv2/opencv.hpp> using namespace cv; void main(){ Mat ...

  7. opencv-学习笔记(6)图像梯度Sobel以及canny边缘检测

    opencv-学习笔记(6)图像梯度Sobel以及canny边缘检测 这章讲了 sobel算子 scharr算子 Laplacion拉普拉斯算子 图像深度问题 Canny检测 图像梯度 sobel算子 ...

  8. Caffe学习笔记4图像特征进行可视化

    Caffe学习笔记4图像特征进行可视化 本文为原创作品,未经本人同意,禁止转载,禁止用于商业用途!本人对博客使用拥有最终解释权 欢迎关注我的博客:http://blog.csdn.net/hit201 ...

  9. MVA Universal Windows Apps系列学习笔记1

    昨天晚上看了微软的Build 2015大会第一天第一场演讲,时间还挺长,足足3个小时,不过也挺震撼的.里面提到了windows 10.Microsoft edge浏览器.Azure云平台.Office ...

随机推荐

  1. HDU 1004 MAP【STL__map_的应用】

    强大的MAP,今天终于开始好好学习一次. map内部是用红黑树维持的有序结构. 定义:map<int,string>mapStudent; 查找的时间复杂度为对数级别. 1.构造方法学习两 ...

  2. hdu 4885 TIANKENG’s travel(bfs)

    题目链接:hdu 4885 TIANKENG's travel 题目大意:给定N,L,表示有N个加油站,每次加满油能够移动距离L,必须走直线,可是能够为斜线.然后给出sx,sy,ex,ey,以及N个加 ...

  3. 再造 “手机QQ” 侧滑菜单(一)——实现侧滑效果

    本系列文章中,我们将尝试再造手机QQ的侧滑菜单,力争最大限度接近手Q的实际效果,并使用 Auto Layout 仿造左侧菜单,实现和主视图的联动. 代码示例:https://github.com/jo ...

  4. 数据库迁移 - SQLServer->MySQL

    SqlServer转换为Mysql的一款工具推荐(mss2sql)

  5. (Relax njuptoj)1009 数的计算(DP)

    其实DP 的关键在于找到子问题的结构.  我们规定arr[i][j]为在j左边填写i时的数的个数,很明显:  arr[i][j]=a[0][i]+a[1][i]+...+arr[i/2][i](i&l ...

  6. Hibernate 3中如何获得库表所有字段的名称

    15问:Hibernate 3中如何获得库表所有字段的名称 答:可以使用以下的程序获得. Configuration conf = new Configuration(); conf.configur ...

  7. windows进程清理脚本

    公司统一配的笔记本Thinkpad T440p,超级难用,常常内存占满.硬盘卡死,还管不了机!心里那个不爽啊!哎,不说了. 自己写了个脚本,用来强制关闭不须要的进程. 脚本例如以下: -------- ...

  8. cocos2d-x3.2中加入Android手机震动

    本人宣布从此博文发出后,我的cocos2dx的引擎从cocos2dx3.1.1跳到cocos2dx3.2,哈哈,事实上变化不大的,不碍事~~~ 以下来说说在cocos中加入Android手机震动的功能 ...

  9. o(n)解决问题:调整数组顺序是奇数位于偶数的前面

    问题描述: 输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分 void reOrder(int *a,int len) { if(a==NULL || ...

  10. android Context的理解

    很多初入Android开发的网友向我们问到Context有什么作用,很多地方都用到它,这里Android123给这些新入门的网友做个简单的解释:  Context字面意思上下文,位于framework ...