Board logo

标题: OpenCV 2.4.3 C++ 平滑处理分析 [打印本页]

作者: yuyang911220    时间: 2017-4-21 21:36     标题: OpenCV 2.4.3 C++ 平滑处理分析

原理
平滑也称模糊, 是一项简单且使用频率很高的图像处理方法。
平滑处理时需要用到一个滤波器。 最常用的滤波器是线性滤波器,线性滤波处理的输出像素值(例如:)是输入像素值(例如:)的加权平均:

称为核, 它仅仅是一个加权系数。
均值平滑
下面是一个使用blur函数的均值平滑:
复制代码 代码如下:
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <stdio.h>
using namespace cv;
int main( int argc, char** argv ){
Mat image;
image = imread( argv[1]);
if( argc != 2 || !image.data ){
printf("没有图片\n");
return -1;
}
namedWindow( "平滑处理-输入" );
namedWindow( "平滑处理-输出" );
imshow( "平滑处理-输入", image );
Mat out;
blur( image, out, Size(3, 3));
imshow( "平滑处理-输出", out );
waitKey( 0 );
}
blur函数API资料:
使用归一化块滤波器进行模糊图片操作。
C++: void blur(InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT ) 参数src – 输入图片,可以使是任意通道数,该函数对通道是独立处理的,但是深度只能是CV_8U, CV_16U, CV_16S, CV_32F or CV_64F。dst – 输出图片,和输入图片相同大小和深度。ksize – 模糊内核大小。anchor – 锚点,默认值是(-1,-1),也就是锚点在内核的中心。borderType – 用于判断图像边界的模式。
该函数对图片进行平滑处理利用了下面的内核:
调用blur(src, dst, ksize, anchor, borderType)相当于调用boxFilter(src, dst, src.type(), anchor, true, borderType)。
blur使用的是归一化块滤波器,输出像素值是核窗口内像素值的均值( 所有像素加权系数相等)。
高斯平滑
下面代码使用了GaussianBlur来实现平滑:
复制代码 代码如下:
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <stdio.h>
using namespace std;
using namespace cv;int main( int argc, char** argv ){
Mat image;
image = imread( argv[1]);
if( argc != 2 || !image.data ){
printf("没有图片\n");
return -1;
}
namedWindow( "平滑处理-输入" );
namedWindow( "平滑处理-输出" );
imshow( "平滑处理-输入", image );
Mat out;
GaussianBlur( image, out, Size( 3, 3 ), 0, 0 );
imshow( "平滑处理-输出", out );
waitKey( 0 );
}
GaussianBlur函数API资料:
使用高斯滤波器进行模糊操作
C++: void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT) 参数 src – 输入图片,可以使是任意通道数,该函数对通道是独立处理的,但是深度只能是CV_8U, CV_16U, CV_16S, CV_32F or CV_64F.dst – 输出图片,和输入图片相同大小和深度。ksize – 高斯内核大小。ksize.width和ksize.height允许不相同但他们必须是正奇数。或者等于0,由参数sigma的乘机决定。sigmaX – 高斯内核在X方向的标准偏差。sigmaY – 高斯内核在Y方向的标准偏差。如果sigmaY为0,他将和sigmaX的值相同,如果他们都为0,那么他们由ksize.width和ksize.height计算得出。borderType – 用于判断图像边界的模式。
最有用的滤波器 (尽管不是最快的)。 高斯滤波是将输入数组的每一个像素点与高斯内核卷积将卷积和当作输出像素值。
参考一维高斯函数,我们可以看见,他是个中间大两边小的函数。
所以高斯滤波器其加权数是中间大,四周小的。
其二维高斯函数为:

其中  为均值 (峰值对应位置), 代表标准差 (变量 和 变量 各有一个均值,也各有一个标准差)。
中值平滑
使用medianBlur执行中值平滑:
复制代码 代码如下:
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <stdio.h>
using namespace std;
using namespace cv;int main( int argc, char** argv ){
Mat image;
image = imread( argv[1]);
if( argc != 2 || !image.data ){
printf("没有图片\n");
return -1;
}
namedWindow( "平滑处理-输入" );
namedWindow( "平滑处理-输出" );
imshow( "平滑处理-输入", image );
Mat out;
medianBlur( image, out, 3);
imshow( "平滑处理-输出", out );
waitKey( 0 );
}




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0