关于cvSmooth(包括简单,中值,高斯,双边)的总结

函数cvSmooth可使用简单模糊简单无缩放变换的模糊中值模糊高斯模糊双边滤波的任何一种方法平滑图像。每一种方法都有自己的特点以及局限。没有缩放的图像平滑仅支持单通道图像,并且支持8位到16位的转换(与cvSobel和cvaplace相似)和32位浮点数到32位浮点数的变换格式。简单模糊和高斯模糊支持1-或3-通道,8-比特和32-比特浮点图像。这两种方法可以(in-place)方式处理图像。中值和双向滤波工作于1-或3-通道,8-位图像,但是不能以in-place方式处理图像。

第一点:注意它们的通道限制和位

void cvSmooth( const CvArr* src, CvArr* dst,int smoothtype=CV_GAUSSIAN,int param1=3, int param2=0, double param3=0 ,double param4=0);
src:输入图像.
dst:输出图像.
smoothtype:平滑方法


CV_BLUR_NO_SCALE (简单不带尺度变换的模糊) - 对每个象素的 param1×param2 领域求和。如果邻域大小是变化的,可以事先利用函数 cvIntegral 计算积分图像。
. CV_BLUR (simple blur) - 对每个象素param1×param2邻域 求和并做尺度变换 1/(param1.param2).
. CV_GAUSSIAN (gaussian blur) - 对 图像进行核大小为 param1×param2 的高斯卷
. CV_MEDIAN (median blur) - 对 图像进行核大小为param1×param1 的 中值滤波(i.e. 邻域是方的).
. CV_BILATERAL (双向滤波) - 应用双向 3x3 滤波,彩色sigma=param1,空间 sigma=param2. 平滑操作的第一个参数.
param2
平滑操作的第二个参数. 对于简单/非尺度变换的 高斯模糊的情况,如果param2的值 为零,则表示其被设定为param1。
param3
对应高斯参数的 Gaussian sigma (标准差). 如果为零,则标准差由下面的核尺寸计算:
sigma = (n/2 - 1)*0.3 + 0.8, 其中 n=param1 对应水平核,
n=param2 对应垂直核.
对小的卷积核 (3×3 to 7×7) 使用如上公式所示的标准 sigma 速度会快。如果 param3 不为零,而 param1 和 param2 为零,则核大小有 sigma 计算 (以保证足够精确的操作).

函数 cvSmooth 可使用上面任何一种方法平滑图像。每一种方法都有自己的特点以及局限
没有缩放的 图像平滑仅支持单通道图像,并且支持8位到16位的转换(与 cvSobel和cvLaplace相似)和32位浮点数到32位浮点数的变换格式。
简单模糊和 高斯模糊支持 1- 或 3-通道, 8-比特 和 32-比特 浮点图像。这两种方法可以(in-place)方式处理图像。
中值和双向滤波工作于 1- 或 3-通道, 8-位图像,但是不能以 in-place 方式处理图像.


中值滤波法是一种非线性平滑技术,它将每一象素点的灰度值设置为该点某邻域窗口内的所有象素点灰度值的中值。实现方法:
通过从图像中的某个采样窗口取出奇数个数据进行排序
用排序后的中值取代要处理的数据即可

中值滤波法对消除椒盐噪音非常有效,在光学测量条纹图象的相位分析处理方法中有特殊作用,但在条纹中心分析方法中作用不大。中值滤波在图像处理中,常用于用来保护边缘信息,是经典的平滑噪声的方法

中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的值,从而消除孤立的噪声点。方法是去某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。二维 中值滤波输出为g(x,y)=med{f(x-k,y-l),(k,l∈W)} ,其中,f(x,y),g(x,y)分别为原始图像和处理后图像。W为二维模板,通常为2*2,3*3区域,也可以是不同的的形状,如线状,圆形,十字形,圆环形等。


高斯滤波实质上是一种信号的滤波器,其用途是信号的平滑处理,我们知道数字图像用于后期应用,其噪声是最大的问题,由于误差会累计传递等原因,很多图像处理教材会在很早的时候介绍Gauss滤波器,用于得到信噪比SNR较高的图像(反应真实信号)。于此相关的有Gauss-Laplace变换,其实就是为了得到较好的 图像边缘,先对图像做Gauss平滑滤波,剔除噪声,然后求二阶导矢,用二阶导的过零点确定边缘,在计算时也是频域乘积=>空域卷积。

滤波器就是建立的一个数学模型,通过这个模型来将图像数据进行能量转化,能量低的就排除掉,噪声就是属于低能量部分

其实编程运算的话就是一个模板运算,拿图像的八连通区域来说,中间点的像素值就等于八连通区的像素值的均值,这样达到平滑的效果

若使用理想滤波器,会在 图像中产生振铃现象。采用高斯滤波器的话, 系统函数是平滑的,避免了振铃现象。


#include <cv.h>
#include <highgui.h>
#include <iostream>
using namespace cv;
using namespace std;
//函数声明-->--->-->--->-->--->-->--->//
int main()
{
    const char * fileName = "eye_.jpg";    
    IplImage * img = cvLoadImage(fileName, CV_LOAD_IMAGE_UNCHANGED);    
    assert(img); 
    IplImage * dst = cvCloneImage(img);
    cvZero(dst); 
    cvNamedWindow("ExerciseWindow", 0);    
    cvNamedWindow("简单模糊", 0);
    cvNamedWindow("简单无缩放模糊", 0);
    cvNamedWindow("中值滤波器模糊", 0);
    cvNamedWindow("高斯模糊", 0);
    cvNamedWindow("双边滤波", 0);
    cvShowImage("ExerciseWindow", img);
    //---------------------------简单模糊:开始--------------------------------//  
    cvSmooth(img, dst, CV_BLUR, 5);
    cvShowImage("简单模糊", dst);
cvSaveImage("简单模糊.jpg",dst);
    //---------------------------简单模糊:结束--------------------------------//        
     
    //---------------------------简单无缩放模糊:开始--------------------------------//
    //注意:使用CV_BLUR_NO_SCALE平滑类型,输入图像和输出图像必须有不同的数据精度
    IplImage * blur_NO_Scale = cvCreateImage(cvSize(img->width, img->height), IPL_DEPTH_16S, img->nChannels);
    blur_NO_Scale->origin = img->origin;
    cvZero(blur_NO_Scale); 
    cvSmooth(img, blur_NO_Scale, CV_BLUR_NO_SCALE, 5);
    cvShowImage("简单无缩放模糊", blur_NO_Scale);
cvSaveImage("简单无缩放模糊.jpg",blur_NO_Scale);
    //---------------------------简单无缩放模糊:结束--------------------------------//    
    //---------------------------中值滤波器:开始--------------------------------//
    //注意:CV_MEDIAN平滑类型不支持in place方式
    IplImage * image_Median = cvCloneImage(img);
    cvZero(image_Median);
    cvSmooth(img, image_Median, CV_MEDIAN, 5);
    cvShowImage("中值滤波器模糊", image_Median);
cvSaveImage("中值滤波模糊.jpg",image_Median);
    //---------------------------中值滤波器:结束--------------------------------//    
    //---------------------------高斯模糊:开始--------------------------------//
    IplImage * image_Gauss = cvCloneImage(img);
    cvZero(image_Gauss);
    cvSmooth(img, image_Gauss, CV_GAUSSIAN, 5,5,3,3);
    cvShowImage("高斯模糊", image_Gauss);
cvSaveImage("高斯模糊.jpg",image_Gauss);
    //---------------------------高斯模糊:结束--------------------------------//    
   //---------------------------双边滤波:开始--------------------------------//
    //特别注意:CV_BILATERAL平滑类型的输入和输出图像必须是8u,也就是灰度图
    //因该平滑类型不支持in place方式,故多次平滑时注意增加临时图像
    IplImage * image_BIL = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
    cvCvtColor(img, img_Gray, CV_BGR2GRAY);*/
    IplImage * image_BIL = cvCloneImage(img);
    IplImage * temp_image = cvCloneImage(img);
    cvZero(temp_image);    
    cvSmooth(img, temp_image, CV_BILATERAL, 3, 3, 11, 11);
    int j = 0;
    while (j<100)
    {
        //注意:使用CV_BILATERAL平滑类型时cvSmooth参数中的最后两个11
        cvSmooth(temp_image, image_BIL, CV_BILATERAL, 7, 7, 11, 11);
        cvCopyImage(image_BIL, temp_image);
        j++;
    }
    cvShowImage("双边滤波", image_BIL);
cvSaveImage("双边滤波.jpg",image_BIL);
    //---------------------------双边滤波:结束--------------------------------//    
    cvWaitKey(0);
    cvReleaseImage(&img);
    cvReleaseImage(&dst);
    cvReleaseImage(&blur_NO_Scale);
    cvReleaseImage(&image_Median);
    cvReleaseImage(&image_Gauss);
    cvReleaseImage(&image_BIL);
    cvDestroyWindow("ExerciseWindow");     
    cvDestroyWindow("简单模糊"); 
    cvDestroyWindow("简单无缩放模糊");
    cvDestroyWindow("中值滤波器模糊");
    cvDestroyWindow("高斯模糊");
    cvDestroyWindow("双边滤波");
    return 0;
}

原图:

关于cvSmooth(包括简单,中值,高斯,双边)的总结_第1张图片

简单模糊:

关于cvSmooth(包括简单,中值,高斯,双边)的总结_第2张图片

简单无缩放模糊:

关于cvSmooth(包括简单,中值,高斯,双边)的总结_第3张图片

中值滤波:

关于cvSmooth(包括简单,中值,高斯,双边)的总结_第4张图片

高斯模糊:

关于cvSmooth(包括简单,中值,高斯,双边)的总结_第5张图片

双边滤波:

关于cvSmooth(包括简单,中值,高斯,双边)的总结_第6张图片

优势对比: 
高斯滤波:
适合对象:真实图像在空间内的像素是缓慢变化的,因此临近点的像素编号不会很明显。但是随即的两个点就可能形成很大的像素差(也就是说空间上噪声点不是相互联系的

优点:高斯滤波在保留信号的条件下减少噪声

缺点:这种方法在接近边缘就无效了,在那儿你不希望像素与相邻像素相关。因此高斯滤波会磨平边缘

双边滤波:

优点:双边滤波能够提供一种不会将边缘平滑掉的方法。但作为代价,需要更多的处理时间。测试过程中,双边滤波耗时比其他方法明显多

原理简记:可以将双边滤波视为高斯平滑,对相似的像素赋予较高的权重,不相似的像素赋予较小的权重。

适用对象:可用于图像分割

注意事项:仅适用于8u类型

其它:从上面双边滤波对原始图像处理100次的效果来看,高斯滤波对于孤立的小的噪声点去噪明显,当然这有待理论支持

简单无缩放模糊:

注意事项:输入图像和结果图像必须有不同的数值精度

中值滤波:

原理简记:中值滤波器将中心像素的正方形邻域内的每个像素值用中间像素值(不是平均像素值)替换。

优点:基于平均算法的simple blur对噪声图像特别是大的孤立点(有时被称为"镜头噪声")的图像非常敏感,即使有极少数量点存在较大差异也会导致平均值的明显波动,中值滤波可以通过选择中间值避免这些点的影响。

其它:从处理效果看,中值滤波器对消除纹理效果明显。有待理论支持

(完)

你可能感兴趣的:(opencv,图像处理)