您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > opencv几种常见滤波器使用方法
OpenCv中几种常见的滤波器一.滤波器的作用1.问题:数字图像信号的频率分布?回答:信号或者图像的能量大部分在中低频段,少部分有用信号在高频段被噪声淹没(噪声都是高频信号)。因此设计滤波器能降低高频成分幅度就能减弱噪声影响。2.问题:为什么要进行图像滤波?回答:1.适应图像处理要求,消除图像数字化时所混入的噪声。2.提取对象的特征作为图像识别的特征模式(没遇到过!)3.问题:如何理解滤波器?回答:把滤波器想象成一个包含加权系数的窗口,当使用滤波器平滑处理图像时,相当于把窗口放到图像上,透过窗口看图像。4.问题:滤波器实现的结果是怎么样的?回答:对图像做平滑或滤波后图像变得更模糊。二.滤波器分类2.1线性滤波器1.低通滤波器:允许低频率通过2.高通滤波器:允许高频率通过3.带通滤波器:允许一定范围频率通过4.带阻滤波器:阻止一定范围频率通过5.全通滤波器:允许所有频率通过,只是改变相位2.1.1Opencv中提供的线性滤波函数1.方框滤波:boxFilter函数函数原型:voidboxFilter(InputArraysrc,OutputArraydst,intddepth,Sizeksize,Pointanchor=Point(-1,-1),boolnormalize=true,intborderType=BORDER_DEFAULT)参数说明:InputArray,输入图像src。OutputArray,输出图像dst。Int类型ddepth,输出图像深度,-1代表使用原图src深度。Size类型ksize,内核大小,一般用Size(w,h),w为宽度,h为深度。Point类型anchor,被平滑的点,表示取内核中心,默认值Point(-1,-1)。Bool类型normalize,标识符,表示内核是否被归一化。默认值为true。Int类型boderType,推断图像外部像素的某种边界模式。默认值BORDER_DEFAULT。2.均值滤波:blur函数函数原型:voidblur(InputArraysrc,OutputArraydst,intddepth,Sizeksize,Pointanchor=Point(-1,-1),intborderType=BORDER_DEFAULT)参数说明:InputArray,输入图像src。OutputArray,输出图像dst。Int类型ddepth,输出图像深度,-1代表使用原图src深度。Size类型ksize,内核大小,一般用Size(w,h),w为宽度,h为深度。Point类型anchor,被平滑的点,表示取内核中心,默认值Point(-1,-1)。Int类型boderType,推断图像外部像素的某种边界模式。默认值BORDER_DEFAULT。3.高斯滤波:GaussianBlur函数函数原型:voidGaussianBlur(InputArraysrc,OutputArraydst,Sizeksize,doublesigmaX,doublesigmaY=0,intborderType=BORDER_DEFAULT)参数说明:InputArray,输入图像src。OutputArray,输出图像dst.Size类型ksize,内核大小,一般用Size(w,h),w为宽度,h为深度。double类型的sigmaX,表示高斯核函数在X方向上的标准偏差。Double类型的sigmaY,表示高斯核函数在Y方向上的标准偏差,sigmaY有默认值为0.如果sigmaX和sigmaY都为0,由内核的宽高计算出来。Int类型boderType,推断图像外部像素的某种边界模式。默认值BORDER_DEFAULT。4.补充:boxblur函数中的参数normalize,当normalize=true时为均值滤波。言外之意,均值滤波是方框滤波归一化后的特殊情况。2.1.2线性滤波器的计算方法图注:邻域滤波(卷积):左边图像与中间图像的卷积产生右边图像。目标图像中蓝色标记的像素是利用原图像中红色标记的像素计算得到的。线性滤波处理的输出像素值是输入像素值的加权和:其中的加权和为,我们称其为“核”,滤波器的加权系数,即滤波器的“滤波系数”。上面的式子可以简单写作:其中f表示输入像素值,h表示加权系数“核“,g表示输出像素值。举例说明:对待处理的当前像素,选择一个内核大小,该内核为其邻近的若干个像素组成,用内核的均值来替代原像素的值的方法。取出图像中的几个像素点,并标注需要处理的像素点F(X,Y)1234F(X,Y)5678图注:1~8为(x,y)的邻近像素设置内核大小通过均值滤波器后其计算为:F(X,Y)=(f(x-1,y-1)+f(x,y-1)+f(x+1,y-1)+f(x-1,y)+f(x,y)+f(x+1,y)+f(x-1,y+1)+f(x,y+1)+f(x+1,y+1))/9设置内核大小通过方框滤波器后其计算为:F(X,Y)=f(x-1,y-1)+f(x,y-1)+f(x+1,y-1)+f(x-1,y)+f(x,y)+f(x+1,y)+f(x-1,y+1)+f(x,y+1)+f(x+1,y+1)通过高斯滤波器利用公式:代入x,y值可以算出F(X,Y)的值。2.2非线性滤波器1.中值滤波:像素点邻域灰度值的中值代替该像素点的灰度值。2.双边滤波:基于空间分布的高斯滤波函数,比高斯滤波多一个sigma-d的高斯方差。2.2.1Opencv中提供的非线性滤波函数1.中值滤波:medianBlur函数函数原型:voidmedianBlur(InputArraysrc,OutputArraydst,intksize)参数说明:InputArray,输入图像src。OutputArray,输出图像dst.int类型ksize,孔径的线性尺寸,这个参数必须是大于1的奇数2.双边滤波:bilateralFilter(InputArraysrc,OutputArraydst,intd,doublesigmaColor,doublesigmaSpace,intborderType=BORDER_DEFAULT)参数说明:InputArray,输入图像src。OutputArray,输出图像dst.Int类型的d,表示过滤过程每个像素邻域的直径double类型的sigmaColor,表示颜色滤波器的sigma值Double类型的sigmaSpace,表示坐标空间的sigma值Int类型boderType,推断图像外部像素的某种边界模式。默认值BORDER_DEFAULT。)三.几种滤波器的使用本示例在opencv3.0+VS2012运行环境下测试,不管利用opencv或者VS什么版本其实程序都是一样的。只不过在包含头文件时注意位置就好了。#includeopencv2/opencv.hppusingnamespacecv;usingnamespacestd;#defineWINDOWS_NAME1【原图】#defineWINDOWS_NAME2【方框滤波】#defineWINDOWS_NAME3【均值滤波】#defineWINDOWS_NAME4【高斯滤波】#defineWINDOWS_NAME5【中值滤波】#defineWINDOWS_NAME6【双边滤波】intmain(){system(color5E);//把dos框背景颜色改变,只是看看效果,默认dos框背景为黑色。MatsrcImage=imread(D:\\ProgramFiles\\图片\\Example4.jpg);//读入原图if(!srcImage.data){cout读取srcImage错误~!endl;//用到了输入输出流,头文件要加“usingnamespacestd;”returnfalse;}//创建5个Mat矩阵用来存放滤波数据,利用clone函数使其大小和原图大小相同Matbox_Image=srcImage.clone();Matblur_Image=srcImage.clone();Matgaussian_Image=srcImage.clone();Matmedian_Image=srcImage.clone();Matbilateral_Image=srcImage.clone();//=================显示原图===================namedWindow(WINDOWS_NAME1,1);imshow(WINDOWS_NAME1,srcImage);//=================方框滤波===================namedWindow(WINDOWS_NAME2,1);boxFilter(srcImage,box_Image,-1,Size(3,3),Point(-1,-1),false,BORDER_DEFAULT);imshow(WINDOWS_NAME2,box_Image);//=================均值滤波===================namedWindow(WINDOWS_NAME3,1);blur(srcImage,blur_Image,Size(3,3),Point(-1,-1),BORDER_DEFAULT);imshow(WINDOWS_NAME3,blur_Image);//=================高斯滤波===================namedWindow(WINDOWS_NAME4,1);GaussianBlur(srcImage,gaussian_Image,Size(3,3),0,0,BORDER_DEFAULT);imshow(WINDOWS_NAME4,gaussian_Image);//=================中值滤波===================namedWindow(WINDOWS_NAME5,1);medianBlur(srcImage,median_Image,7);imshow(WINDOWS_NAME5,median_Image);//=================双边滤波===================namedWindow(WINDOWS_NAME6,1);bilateralFilter(srcImage,bilateral_Image,25,25*2,25/2,BORDER_DEFAULT);imshow(WINDOWS_NAME6,bilateral_Image);cvWaitKey(0);return0;}
本文标题:opencv几种常见滤波器使用方法
链接地址:https://www.777doc.com/doc-2847523 .html