赞
踩
滤波实际上是信号处理的一个概念,图像可以看成一个二维信号,其中像素点灰度值得高低代表信号的强弱
高频:图像中变化剧烈的部分
低频︰图像中变化缓慢,平坦的部分
根据图像高低频特性,设置高通和低通滤波器。高通滤波可以检测图像中尖锐、变化明显的地方,低通滤波可以让图像变得平滑﹐消除噪声干扰
图像滤波是OpenCV图像处理的重要部分﹐在图像预处理方面应用广泛﹐图像滤波的好坏决定着后续处理的结果好坏
邻域算子:利用给定像素周围的像素值决定此像素的最终输出值的一种算子
一种常用的邻域算子﹐像素输出取决于输入像素的加权和,如下图示:
线性滤波器输出像素g(i,j)是输入像素f(i+k, j+I)的加权和﹐其中h(k,l)我们称之为核,是滤波器的加权系数,上面式子简写为︰
当normalize为true时,方框滤波也就成了均值滤波。也就是说均值滤波是方框滤波归一化后的特殊情况。归一化就是将要处理的量缩放到一定范围,比如(0,1)。
void boxFilter( InputArray src,OutputArray dst,int ddepth,Size ksize,Point anchor = Point(-1,-1),bool normalize = true,int borderType = BORDER_DEFAULT )
//ddepth:输出图像的深度, -1代表使用原图像深度,即src.depth()
//ksize: Size类型表示内核大小,一般用Size(w,h)表示内核大小,Size(3,3)表示3x3的核大小
//anchor:表示锚点(即被平滑的那个点),默认值Point(-1,-1),表示锚点在核中心
//一般修改Size到自己想要的值就行,其他值默认
Mat srcImg = imread("E:\\OpenCV\\images\\car.jpg");
Mat dstImg;
boxFilter(srcImg, dstImg, -1, Size(5, 5));
imshow("dst", dstImg);
imshow("img", srcImg);
waitKey(0);
均值滤波即方框滤波归一化特例,就是用邻域内像素均值来代替该点像素值﹐均值滤波在去噪的同时也破坏了图像细节部分
void blur (InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT )
//一般修改Size到自己想要的值就行,其他值默认
//ksize: Size类型表示内核大小,一般用Size(w,h)表示内核大小,Size(3,3)表示3x3的核大小
blur(srcImg, dstImg, Size(5, 5));
高斯滤波器被称为最有用的滤波器,每个像素点都是由本身和邻域内的其他像素值经过加权平均后得到的,加权系数越靠近中心越大,越远离中心越小,能够很好的滤除噪声。
void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT);
//src,输入图像,即源图像,填Mat类的对象即可。它可以是单独的任意通道数的图片,但需要注意,图片深度应该为CV_8U,CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
//dst,即目标图像,需要和源图片有一样的尺寸和类型。比如可以用Mat::Clone,以源图片为模板,来初始化得到如假包换的目标图。
//ksize,高斯内核的大小。其中ksize.width和ksize.height可以不同,但他们都必须为正数和奇数(并不能理解)。或者,它们可以是零的,它们都是由sigma计算而来。
//sigmaX,表示高斯核函数在X方向的的标准偏差。
//sigmaY,表示高斯核函数在Y方向的的标准偏差。若sigmaY为零,就将它设sigmaX,
//如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height计算出来。
GaussianBlur(srcImg, dstImg, Size(3,3 ), 1);
中值滤波是一种排线性港波,是用像素点邻域灰度值的中值代替该点的厌度值,可以去除脉冲噪声和椒盐噪声(去掉像实例中雪花中效果)
void medianBlur(InputArray src, OutputArray dst, int kszie);
//ksize: int类型的孔释的线性尺寸,大于1的奇数
双边滤波是一种非线性滤波,是结合图像空间邻近度和像秦值相似度的一种折中处理,尽量在去噪同时保存边缘
这里直接看别的up吧
void bilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType=BORDER_DEFAULT )
//InputArray src: 输入图像,可以是Mat类型,图像必须是8位或浮点型单通道、三通道的图像。
//OutputArray dst: 输出图像,和原图像有相同的尺寸和类型。
//int d: 表示在过滤过程中每个像素邻域的直径范围。如果这个值是非正数,则函数会从第五个参数sigmaSpace计算该值。
//double sigmaColor: 颜色空间过滤器的sigma值,这个参数的值月大,表明该像素邻域内有月宽广的颜色会被混合到一起,产生较大的半相等颜色区域。
//double sigmaSpace: 坐标空间中滤波器的sigma值,如果该值较大,则意味着颜色相近的较远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当d>0时,d指定了邻域大小且与sigmaSpace五官,否则d正比于sigmaSpace.
// int borderType=BORDER_DEFAULT: 用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT.
bilateralFilter(srcImg, dstImg, 5, 10.0, 2.0);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。