OpenCV2.4.3C++平滑处理分析
原理
平滑也称模糊,是一项简单且使用频率很高的图像处理方法。
平滑处理时需要用到一个滤波器。最常用的滤波器是线性滤波器,线性滤波处理的输出像素值(例如:
均值平滑
下面是一个使用blur函数的均值平滑:
#include"opencv2/core/core.hpp"
#include"opencv2/highgui/highgui.hpp"
#include"opencv2/imgproc/imgproc.hpp"
#include<stdio.h>
usingnamespacecv;
intmain(intargc,char**argv){
Matimage;
image=imread(argv[1]);
if(argc!=2||!image.data){
printf("没有图片\n");
return-1;
}
namedWindow("平滑处理-输入");
namedWindow("平滑处理-输出");
imshow("平滑处理-输入",image);
Matout;
blur(image,out,Size(3,3));
imshow("平滑处理-输出",out);
waitKey(0);
}
使用归一化块滤波器进行模糊图片操作。
C++:该函数对图片进行平滑处理利用了下面的内核:
调用
blur使用的是归一化块滤波器,输出像素值是核窗口内像素值的均值(所有像素加权系数相等)。
高斯平滑
下面代码使用了GaussianBlur来实现平滑:
#include"opencv2/core/core.hpp"
#include"opencv2/highgui/highgui.hpp"
#include"opencv2/imgproc/imgproc.hpp"
#include<stdio.h>
usingnamespacestd;
usingnamespacecv;intmain(intargc,char**argv){
Matimage;
image=imread(argv[1]);
if(argc!=2||!image.data){
printf("没有图片\n");
return-1;
}
namedWindow("平滑处理-输入");
namedWindow("平滑处理-输出");
imshow("平滑处理-输入",image);
Matout;
GaussianBlur(image,out,Size(3,3),0,0);
imshow("平滑处理-输出",out);
waitKey(0);
}
GaussianBlur函数API资料:
使用高斯滤波器进行模糊操作
C++:最有用的滤波器(尽管不是最快的)。高斯滤波是将输入数组的每一个像素点与高斯内核卷积将卷积和当作输出像素值。
参考一维高斯函数,我们可以看见,他是个中间大两边小的函数。
所以高斯滤波器其加权数是中间大,四周小的。
其二维高斯函数为:
其中
中值平滑
使用medianBlur执行中值平滑:
#include"opencv2/core/core.hpp"
#include"opencv2/highgui/highgui.hpp"
#include"opencv2/imgproc/imgproc.hpp"
#include<stdio.h>
usingnamespacestd;
usingnamespacecv;intmain(intargc,char**argv){
Matimage;
image=imread(argv[1]);
if(argc!=2||!image.data){
printf("没有图片\n");
return-1;
}
namedWindow("平滑处理-输入");
namedWindow("平滑处理-输出");
imshow("平滑处理-输入",image);
Matout;
medianBlur(image,out,3);
imshow("平滑处理-输出",out);
waitKey(0);
}
medianBlur函数API资料:
使用中值滤波器进行模糊操作
C++:中值滤波将图像的每个像素用邻域(以当前像素为中心的正方形区域)像素的中值代替。
双边平滑
使用bilateralFilter执行双边平滑:
#include"opencv2/core/core.hpp"
#include"opencv2/highgui/highgui.hpp"
#include"opencv2/imgproc/imgproc.hpp"
#include<stdio.h>
usingnamespacestd;
usingnamespacecv;intmain(intargc,char**argv){
Matimage;
image=imread(argv[1]);
if(argc!=2||!image.data){
printf("没有图片\n");
return-1;
}
namedWindow("平滑处理-输入");
namedWindow("平滑处理-输出");
imshow("平滑处理-输入",image);
Matout;
bilateralFilter(image,out,3,3*2,3/2);
imshow("平滑处理-输出",out);
waitKey(0);
}
bilateralFilter的API资料:
对一个图片应用双边滤波器。
C++:原理可参考:
http://www.dai.ed.ac.uk/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html
目前我们了解的滤波器都是为了平滑图像,问题是有些时候这些滤波器不仅仅削弱了噪声,连带着把边缘也给磨掉了。为避免这样的情形(至少在一定程度上),我们可以使用双边滤波。
类似于高斯滤波器,双边滤波器也给每一个邻域像素分配一个加权系数。这些加权系数包含两个部分,第一部分加权方式与高斯滤波一样,第二部分的权重则取决于该邻域像素与当前像素的灰度差值。
相关文章
- C++学习之路—— C++异常处理机制
- C++系列笔记(十二)
- EasyC++54,名称空间其他特性
- 深入理解C++11_c++ string char
- c++ auto类型_auto C++
- c++发送post请求_request的post方法作用
- C++构造函数的作用_c++什么是构造函数
- C++通过array实现二维数组
- C++ 和 Java 中的默认虚拟行为有何不同及其异常处理的比较
- C++结构体和类的区别_c++有结构体吗
- C++ 不知树系列之认识二叉树(数组、链表存储的实现)
- c++的链表-C++链表
- C/C++ 字符串拷贝处理
- C/C++ 实现模拟键盘鼠标
- C++类和对象(上)
- C++三种继承方式详解编程语言
- C++ 类中特殊的成员变量(常变量、引用、静态)的初始化方法详解编程语言
- C++随机数生成器(default_random_engine)用法详解
- C++深拷贝和浅拷贝(C++深复制和浅复制)
- C++ deque修改(替换、更改)元素详解
- 浅析c/c++中函数的参数传递
- 用标准c++实现string与各种类型之间的转换
- C++模板类的用法
- c++中template对字符串的处理方法