初学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. 【每日一题】 UVA - 340 阅读理解+模拟

    https://cn.vjudge.net/problem/UVA-340 题目很难读,差不多读了两天 意思是给你一个n个数的数列,然后有m个询问,每个询问也是一个n个数的数列,让你输出两个数:一个是 ...

  2. 制作dlib(面部识别检测)静态库

    参考或引用网址: 快速精准的人头检测,代码已开源http://url.cn/5e3qQPN http://www.jianshu.com/p/701e8dea887e 官网文档 GitHub地址 1. ...

  3. [math][mathematica] Mathematica进阶

    1. Mathematica 画函数图像 2. Mathematica 解方程 见截图,敲完一行按Shift+Enter就可以执行了.主要函数名都是大小写敏感的.写的正确会跟有提示下拉框和相信说明,非 ...

  4. 深探树形dp

    看到同学在写一道树形dp,好奇直接拿来写,发现很不简单. 如图,看上去是不是很像选课,没错这不是选课,升级版吧,多加了点东西罢了.简单却调了一晚上和一上午. 思路:很简单强联通分量+缩点+树形dp.直 ...

  5. hdfs mapreduce hbase

    参考资料:http://www.cnblogs.com/sharpxiajun/p/5585613.html 大数据时代的数据量是超大规模的,传统的关系数据库已经很难存储和管理这些数据了,为了存储海量 ...

  6. LeetCode 617 Merge Two Binary Trees 解题报告

    题目要求 Given two binary trees and imagine that when you put one of them to cover the other, some nodes ...

  7. LeetCode 461 Hamming Distance 解题报告

    题目要求 The Hamming distance between two integers is the number of positions at which the corresponding ...

  8. 20165336 2017-2018-2 《Java程序设计》第1周学习总结

    20165336 2017-2018-2 <Java程序设计>第1周学习总结 教材学习内容总结 Java地位.特点:Java具有面向对象.与平台无关.安全.稳定和多线程等优良特性.Java ...

  9. css盒子模型之边框

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 【JMeter】【性能测试】分布式远程服务器

    jmeter分布式简单步骤说明: 1:添加远程服务器IP到配置文件 在JMETER_HOME / bin / jmeter.properties中,找到名为“ remote_hosts ” 的属性,并 ...