初学OpenCV的开发者很容易被OpenCV中各种滤波方法所困扰,不知道到底该用哪里一个来做滤波。表面原因看起来是因为OpenCV中各种滤波方式实在是太多太杂,

其背后原因是对各种滤波方法的应用场景认知出现了问题,所以这里小编从应用场景与项目中解决问题的实际出发,跟大家一起探讨一下各种滤波方法。

一:模糊函数blur

 

参数说明

 

-参数InputArray表示输入图像Mat对象

-参数OutputArray表示模糊之后输出Mat对象

-参数Size表示卷积核大小,此参数决定模糊程度,Size(x, y)其中x, y取值越大表现模糊程度越深,而且X与Y的值为奇数。

-参数Point表示锚定的位置,也就是卷积核替换重叠像素中的哪个位置。此参数一般使用Point(-1,-1)表示使用卷积核的中心位置。

-最后一个参数表示对边缘的处理方法,一般默认4表示默认处理方法

XY方向模糊-示例代码:

#include<opencv2/opencv.hpp>
#include<iostream>
int main(){
cv::Mat m1 = cv::imread("D:/640.jpg",4);
cv::Mat m2;
cv::namedWindow("windows",CV_WINDOW_AUTOSIZE);
cv::imshow("windows",m1);
cv::blur(m1,m2,cv::Size(5,5),cv::Point(-1,-1),4);
cv::namedWindow("windows1", CV_WINDOW_AUTOSIZE);
cv::imshow("windows1", m2);
cv::waitKey(0);
return 0;
}

应用场景:

通过blur函数一般来去除噪声,可以在图像边缘提取、特征提取之前对图像进行大小为3x3的模糊以此来达到去掉干扰和噪声目的

二:高斯模糊函数GaussianBlur

 

参数说明

 

-参数InputArray表示输入图像Mat对象

-参数OutputArray表示模糊之后输出Mat对象

-参数Size表示卷积核大小,此参数决定模糊程度,Size(x, y)其中x, y取值越大表现模糊程度越深,而且X与Y的值为奇数。

-参数SigmaX表示高斯方程中X方向的标准方差

-参数SigmaY表示高斯方程中X方向的标准方差

-最后一个参数表示对边缘的处理方法,一般默认4表示默认处理方法

其中Size大小表示高斯卷积核、必须是奇数而且必须是正数、SigmaX在当Size大小不为零的时候直接从Size大小计算、SigmaY在SigmaX不为零的时候从X计算、SigmaX为零的时候从Size大小中计算。

高斯模糊卷积核大小5x5-示例代码

#include<opencv2/opencv.hpp>
#include<iostream>
int main(){
cv::Mat m1 = cv::imread("D:/640.jpg",4);
cv::Mat m2;
cv::namedWindow("windows",CV_WINDOW_AUTOSIZE);
cv::imshow("windows",m1);
cv::GaussianBlur(m1,m2,cv::Size(5,5),0,0);
cv::namedWindow("windows1", CV_WINDOW_AUTOSIZE);
cv::imshow("windows1", m2);
cv::waitKey(0);
return 0;
}

#include<opencv2/opencv.hpp>
#include<iostream>
int main(){
cv::Mat m1 = cv::imread("D:/640.jpg",4);
cv::Mat m2;
cv::namedWindow("windows",CV_WINDOW_AUTOSIZE);
cv::imshow("windows",m1);
cv::GaussianBlur(m1,m2,cv::Size(0,0),15,15);
cv::namedWindow("windows1", CV_WINDOW_AUTOSIZE);
cv::imshow("windows1", m2);
cv::waitKey(0);
return 0;
}

应用场景:

高斯模糊的应用场景一般作为退化函数使用,可以去除图像噪声,Canny边缘提取的第一步就是高斯模糊,以此来消除噪声干扰,用高斯模糊去噪对于随机噪声效果明显。

三:中值滤波函数-medianBlur

 

参数说明:

 

-参数InputArray表示输入图像Mat对象

-参数OutputArray表示模糊之后输出Mat对象

-参数ksize表示卷积核大小,必须是正数而且必须是大于1,如:3、5、7等。

共有三个参数、其中第一个表示输入图像Mat对象,第二个表示滤波结果输出Mat对象、第三个参数则表示卷积核的大小。

中值滤波-代码示例

#include<opencv2/opencv.hpp>
#include<iostream>
int main(){
cv::Mat m1 = cv::imread("D:/640.jpg",4);
cv::Mat m2;
cv::namedWindow("windows",CV_WINDOW_AUTOSIZE);
cv::imshow("windows",m1);
cv::medianBlur(m1,m2,5);
cv::namedWindow("windows1", CV_WINDOW_AUTOSIZE);
cv::imshow("windows1", m2);
cv::waitKey(0);
return 0;
}

应用场景:

从上面的例子我们可以看出,中值滤波对椒盐噪声的图像有比较好的效果,可以去除图像中像素极大或者极小值。

四:双边模糊函数-bilateralFilter

参数说明:

 

-参数InputArray表示输入图像Mat对象

-参数OutputArray表示模糊之后输出Mat对象

-参数d表示双边滤波时候中心到周围像素距离

-参数sigmaColor表示高斯核中颜色值标准方差

-参数sigmaSpace表示高斯核中空间的标准方差

-参数borderType表示边缘的处理方法

一共六个参数,其中如果参数d没有申明的话或者是负数的话就从sigmaSpace中计算得到即可。常见的d取值为15或者20如果过大会导致运算时间较长。

#include<opencv2/opencv.hpp>
#include<iostream>
int main(){
cv::Mat m1 = cv::imread("D:/640.jpg",4);
cv::Mat m2;
cv::namedWindow("windows",CV_WINDOW_AUTOSIZE);
cv::imshow("windows",m1);
cv::bilateralFilter(m1,m2,15,120,10,4);
cv::namedWindow("windows1", CV_WINDOW_AUTOSIZE);
cv::imshow("windows1", m2);
cv::waitKey(0);
return 0;
}

应用场景:

高斯双边滤波经常被用来实现图像美化类APP用来做高斯磨皮核心算法,然后基于SOBEL算子进行叠加处理,通过高斯模糊得到最终结果。效果异常明显,是一个不错的选择。

五:滤波函数filter2D

参数说明

 

-参数InputArray表示输入图像Mat对象

-参数OutputArray表示模糊之后输出Mat对象

-参数d表输出图像的深度,-1表示跟输入图像深度相同。

-参数kernel表示自定义的Mat对象,卷积核或者算子。

-参数Point表示锚定的位置,Point(-1, -1)表示默认为卷积核中心位置。

-参数delta表示卷积处理之后的每个像素值是否加上常量delta,默认0.0表示不加上额外值到处理后的像素值上。

-参数borderType表示边缘像素的处理方式,默认为BORDER_DEFAULT。

通过定义不同的卷积核、filter2D函数可以实现卷积的各种功能、包括模糊、锐化、边缘提取等。下面我们就来一一通过代码演示

实现模糊-代码演示

#include<opencv2/opencv.hpp>
#include<iostream>
int main(){
cv::Mat m1 = cv::imread("D:/640.jpg",4);
cv::Mat m2;
cv::namedWindow("windows",CV_WINDOW_AUTOSIZE);
cv::imshow("windows",m1);
int ksize = 15;
cv::Mat kernel = cv::Mat::ones(ksize, ksize, CV_32F) / (float)(ksize*ksize);//ones函数很像MATLAB里的语句吧。这句的意思是先定义一个15×15的32bit浮点数矩阵,元素全为1,所有元素再除以225。
cv::filter2D(m1,m2,-1,kernel,cv::Point(-1,-1),0.0,4);
cv::bilateralFilter(m1,m2,15,120,10,4);
cv::namedWindow("windows1", CV_WINDOW_AUTOSIZE);
cv::imshow("windows1", m2);
cv::waitKey(0);
return 0;
}

实现边缘提取-代码演示

#include<opencv2/opencv.hpp>
#include<iostream>
int main(){
cv::Mat m1 = cv::imread("D:/640.jpg",4);
cv::Mat m2;
cv::namedWindow("windows",CV_WINDOW_AUTOSIZE);
cv::imshow("windows",m1);
int ksize = 15;
cv::Mat kernel =( cv::Mat_<char>(3,3)<<-1,-1,-1,-1,8,-1,-1,-1,-1);
cv::filter2D(m1,m2,-1,kernel,cv::Point(-1,-1),0.0,4);
cv::bilateralFilter(m1,m2,15,120,10,4);
cv::namedWindow("windows1", CV_WINDOW_AUTOSIZE);
cv::imshow("windows1", m2);
cv::waitKey(0);
return 0;
}

实现锐化-代码演示

#include<opencv2/opencv.hpp>
#include<iostream>
int main(){
cv::Mat m1 = cv::imread("D:/640.jpg",4);
cv::Mat m2;
cv::namedWindow("windows",CV_WINDOW_AUTOSIZE);
cv::imshow("windows",m1);
int ksize = 15;
cv::Mat kernel =( cv::Mat_<char>(3,3)<<-1,-1,-1,-1,9,-1,-1,-1,-1);
cv::filter2D(m1,m2,-1,kernel,cv::Point(-1,-1),0.0,4);

cv::namedWindow("windows1", CV_WINDOW_AUTOSIZE);
cv::imshow("windows1", m2);
cv::waitKey(0);
return 0;
}

Robot算子效果-代码演示

#include<opencv2/opencv.hpp>
#include<iostream>
int main(){
cv::Mat m1 = cv::imread("D:/640.jpg",4);
cv::Mat m2;
cv::namedWindow("windows",CV_WINDOW_AUTOSIZE);
cv::imshow("windows",m1);
int ksize = 15;
cv::Mat kernel =( cv::Mat_<char>(2,2)<<-1,0,0,1);
cv::filter2D(m1,m2,-1,kernel,cv::Point(-1,-1),0.0,4);

cv::namedWindow("windows1", CV_WINDOW_AUTOSIZE);
cv::imshow("windows1", m2);
cv::waitKey(0);
return 0;
}

Sobel算子效果-代码

#include<opencv2/opencv.hpp>
#include<iostream>
int main(){
cv::Mat m1 = cv::imread("D:/1.jpg",4);
cv::Mat m2;
cv::namedWindow("windows",CV_WINDOW_AUTOSIZE);
cv::imshow("windows",m1);
int ksize = 15;
cv::Mat kernel =( cv::Mat_<char>(3,3)<<1,2,1,0,0,0,-1,-2,-1);
cv::filter2D(m1,m2,-1,kernel,cv::Point(-1,-1),0.0,4);

cv::namedWindow("windows1", CV_WINDOW_AUTOSIZE);
cv::imshow("windows1", m2);
cv::waitKey(0);
return 0;
}

应用场景:

filter2D是OpenCV中相当灵活的滤波函数、灵活使用可以适合多个不同应用场景,实现多种功能包括模糊、锐化、边缘提取、图像增强等等。

总结:

OpenCV中为我们提供上述常见5种滤波函数,熟练掌握这五种滤波方法与应用场景是学以致用的关键。

opencv之模糊处理的更多相关文章

  1. opencv 简单模糊和高斯模糊 cvSmooth

    cv::Mat 是C++版OpenCV的新结构. cvSmooth() 是老版 C API. 没有把C接口与C + + 结合. 建议你们也可以花一些时间看一下介绍. 同样,你如果查看opencv/mo ...

  2. opencv 双边模糊,膨胀腐蚀 开 闭操作

    #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; int main(int argc, ...

  3. OpenCV——旋转模糊

    参考来源: 学习OpenCV:滤镜系列(5)--径向模糊:缩放&旋转 // define head function #ifndef PS_ALGORITHM_H_INCLUDED #defi ...

  4. OpenCV——旋转模糊 (二)

    // define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include < ...

  5. opencv知识积累

    1.OpenCV 3计算机视觉:Python语言实现 https://github.com/techfort/pycv 2.OpenCV3编程入门 opencv 均值模糊:一般用来处理图像的随机噪声 ...

  6. 第三节,使用OpenCV 3处理图像(模糊滤波、边缘检测)

    一 不同色彩空间的转换 OpenCV中有数百种关于在不同色彩空间之间转换的方法.当前,在计算机中有三种常用的色彩空间:灰度,BGR以及HSV(Hue,Saturation,Value). 灰度色彩空间 ...

  7. 图像的模糊-opencv

    调用两个API,一个是均值模糊,一个是高斯模糊.如下所示: #include<opencv2/opencv.hpp> #include<iostream> using name ...

  8. 【计算机视觉】OpenCV篇(6) - 平滑图像(卷积/滤波/模糊/降噪)

    平滑滤波 平滑滤波是低频增强的空间域滤波技术.空间域滤波技术即不经由傅立叶转换,直接处理影像中的像素,它的目的有两类:一类是模糊:另一类是消除噪音.空间域的平滑滤波一般采用简单平均法进行,就是求邻近像 ...

  9. 学习OpenCV:滤镜系列(15)——羽化(模糊边缘)

    ============================================== 版权所有:小熊不去实验室CSDN博客 ================================== ...

随机推荐

  1. [No000014F]计算机编程语言家族史

    https://www.levenez.com/lang/

  2. [No0000CC]眼袋和黑眼圈的应对方法——疏筋穴

    眼袋和黑眼圈不是自然衰老的必然产物.<黄帝内经>上说:"肝主筋."筋就是人身体上的韧带.肌腱部分.很多病症,说不清原因,但都可以遵循一个原则,那就是从筋论治. 1.常按 ...

  3. Python:random模块

    近排练习代码时候经常会用到random模块,以防后面忘记还是需要记录一下. 首先导入模块: import random random.random():用于生成一个0到1的随机浮点数: 0 <= ...

  4. gateone安装使用

    下载地址 https://github.com/liftoff/GateOne unzip GateOne-master.zip cd GateOne-master/ python setup.py ...

  5. stl, string不仅是charString, 更是byteString

     转载至:http://chzhou.blog.sohu.com/97459512.html 以前一直没有注意到STL中的string的length函数,但一直用它.天真的以为它会返回字符串的长度 ...

  6. webpack打包配置模板

    /** * Created by zzq on 2017/3/26. *///__dirname是node.js中的一个全局变量,它指向当前执行脚本所在的目录module.exports = {//注 ...

  7. mongo 的简单查询语法

    小白的我对MONGO的一些语句搜集用于区别mysql及一些小常识 pymongo 语法按照id进行倒序操作db.news.find().limit(20).sort([("_id" ...

  8. 牛客网Wannafly挑战赛25A 因子 数论

    正解:小学数学数论 解题报告: 传送门 大概会连着写几道相对而言比较简单的数学题,,,之后就会比较难了QAQ 所以这题相对而言还是比较水的,,, 首先这种题目不难想到分解质因数趴,, 于是就先对p和n ...

  9. 【Python爬虫】Requests库的基本使用

    Requests库的基本使用 阅读目录 基本的GET请求 带参数的GET请求 解析Json 获取二进制数据 添加headers 基本的POST请求 response属性 文件上传 获取cookie 会 ...

  10. Apache SSL 服务搭建

    Web服务器在默认情况下使用HTTP,这是一个纯文本的协议.正如其名称所暗示的,纯文本协议不会对传输中的数据进行任何形式的加密.而基于HTTP的Web服务器是非常容易配置,它在安全方面有重大缺陷.任何 ...