您的位置:首页 > 运维架构

Opencv学习之线性滤波

2017-06-15 16:00 211 查看
平滑处理也称模糊处理,常用作减少图像上的噪点,失真以及降低图像分辨率。
图像滤波是指尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,消除图像中的噪声成分叫做图像的平滑化或滤波操作。
平滑滤波是低频增强的空间域滤波技术,目的:模糊和去噪。


方框滤波–boxFilter函数

void boxFilter(InputArray, OutputArray, int ddepth,Size ksize,Point anchor=Point(-1,-1),boolnormalize=true,int borderType=BORDER_DEFAULT)
*第一个参数,输入图像,图片深度应为:CV_8U、16U、16S、32F、64F之一。
*第二个参数,输出图像。
*第三个参数,输出图像深度,-1代表使用原图像深度。
*第四个参数,滤波器大小,Size(w,h),w代表图像宽度,h代表图像高度。
*第五个参数,表示被平滑的点(锚点),默认点Point(-1,-1)代表滤波器中心。
*第六个参数,表示滤波器是否被其区域归一化了。当为true时,方框滤波器就变成了均值滤波器,当为false时,用于计算每个像素邻域内的积分特性,如密集光流算法中用到的图像倒数的协方差矩阵。
*第七个参数,用于推断图像外部像素的某种边界模式,一般不用管。


均值滤波–blur函数

void blur(InputArray,OutputArray,Size ksize,Point anchor=Point(-1,-1),int borderType=BORDER_DEFAULT)
*第一个参数,输入图像,图片深度应为:CV_8U、16U、16S、32F、64F之一。
*第二个参数,输出图像。
*第三个参数,滤波器大小,Size(w,h),w代表图像宽度,h代表图像高度。
*第四个参数,表示被平滑的点(锚点),默认点Point(-1,-1)代表滤波器中心。
*第五个参数,用于推断图像外部像素的某种边界模式,一般不用管。


高斯滤波–GaussianBlur函数

其视觉效果就像是经过一个半透明屏幕在观察图像,用于计算机视觉算法中的预处理阶段,以增强图像在不同比例大小下的图像效果(参见尺度空间表示以及尺度空间实现)。
void GaussianBlur(InputArray,OutputArray,Size ksize,double sigmaX,double sigmaY=0,intborderType=BORDER_DEFAULT)
*第一个参数,输入图像,图片深度应为:CV_8U、16U、16S、32F、64F之一。
*第二个参数,输出图像。
*第三个参数,高斯滤波器的大小,宽和高可以不同,但是都必须是正数和奇数,或者零。
*第四个参数,高斯滤波器在X方向的标准偏差。
*第五个参数,高斯滤波器在Y方向的标准偏差。若sigmaY为零,就将它设为sigmaX,如果sigmaX和sigmaY都是0,那么就由滤波器的宽和高计算出来。
*第六个参数,用于推断图像外部像素的某种边界模式,一般不用管。


#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>

using namespace cv;
using namespace std;

//全局变量声明***********************************************
//存储图片的输入输出图片Mat类型
Mat g_srcImage,g_dstImage1,g_dstImage2,g_dstImage3;
//方框,均值,高斯滤波参数值
int g_nBoxFilterValue=2;
int g_nMeanFilterValue=2;
int g_nGaussianFilterValue=2;

//全局函数声明***********************************************
//轨迹回调函数,方框,均值,高斯滤波
static void on_BoxFilter(int,void *);
static void on_MeanFilter(int,void *);
static void on_GaussianFilter(int,void *);

//主函数
int main()
{
system("color5E");
//载入原图
g_srcImage=imread("/Users/new/Desktop/1.jpg",1);
if(!g_srcImage.data){printf("读取源图错误~!\n");return false;}

//复制原图到三个Mat类型中
g_dstImage1=g_srcImage.clone();
g_dstImage2=g_srcImage.clone();
g_dstImage3=g_srcImage.clone();

//显示原图
namedWindow("image[origin]",1);
imshow("image[origin]",g_srcImage);

//方框滤波
namedWindow("image[BoxFilter]",1);
createTrackbar("Filter Size ", "image[BoxFilter]", &g_nBoxFilterValue,30,on_BoxFilter);
on_BoxFilter(g_nBoxFilterValue, 0);

//均值滤波
namedWindow("image[MeanFilter]",1);
createTrackbar("Filter Size ", "image[MeanFilter]", &g_nMeanFilterValue, 30,on_MeanFilter);
on_MeanFilter(g_nMeanFilterValue, 0);

//高斯滤波
namedWindow("image[GaussianFilter]",1);
createTrackbar("Filter Size ", "image[GaussianFilter]", &g_nGaussianFilterValue, 30,on_GaussianFilter);
on_GaussianFilter(g_nGaussianFilterValue, 0);

waitKey();

return 0;

}

//方框滤波操作的回调函数
static void on_BoxFilter(int,void *)
{
boxFilter(g_srcImage,g_dstImage1,-1,Size(g_nBoxFilterValue+1,g_nBoxFilterValue+1));
imshow("image[BoxFilter]",g_dstImage1);
}

//均值滤波操作的回调函数
static void on_MeanFilter(int,void *)
{
blur(g_srcImage,g_dstImage2,Size(g_nMeanFilterValue+1,g_nMeanFilterValue+1),Point(-1,-1));
imshow("image[MeanFilter]",g_dstImage2);
}

//高斯滤波操作的回调函数
static void on_GaussianFilter(int,void *)
{
GaussianBlur(g_srcImage,g_dstImage3,Size(g_nGaussianFilterValue*2+1,g_nGaussianFilterValue*2+1),0,0);
imshow("image[GaussianFilter]",g_dstImage3);
}


原始图片:



方框滤波:



均值滤波:



高斯滤波:



opencv技巧

(1)A.getMat():复制源图的形参Mat数据。Mat类内有.depth(),.channels(),.creat()等。

(2)createTrackbar():创建轨迹条,最小位置为0!。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opencv