天天看点

关于高斯模糊平滑滤波器的参数探讨的汇总

Gaussian filter(CV_GAUSSIAN),虽然它不是最快的,但是它是最有用的滤波器。高斯滤波用卷积核与输入图像的每个点进行卷积,将最终计算结果之和作为输出图像的像素值。

对于高斯模糊,前两个参数代表滤波器窗口的宽度和高度,可选择的第三个参数代表高斯卷积核的sigma值(是最大宽度的四分之一)。如果第三个参数未指定,系统将会根据窗口尺寸通过下面的方程自动确定高斯核的各个参数:

sigma.x=(n.x/2-1)*0.30+0.80,   n.x=param1;

sigma.y=(n.y/2-1)*0.30+0.80,   n.y=param2;

如果用户希望高斯核不对称,那么可以引入第四个参数。这样,第三个和第四个参数分别为水平方向和垂直方向的sigma值。

高斯滤波的opencv的实现还为几个常见的核提供更高的性能优化。具有标准sigma值的3*3,5*5,和7*7比其他核具有更优的性能。高斯模糊支持单个通道或者三个通道的8位或32位的浮点格式图像,可以进行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);

代码:

#include <cv.h>

#include <highgui.h>

int main(int argc, char* argv[])

{

IplImage*input=cvLoadImage("f.jpg");

cvNamedWindow("yuantu",CV_WINDOW_AUTOSIZE);

cvShowImage("yuantu",input);

IplImage*out_a_img=cvCreateImage(cvGetSize(input),input->depth,input->nChannels);

assert(out_a_img!=NULL);

IplImage*out_b_img=cvCreateImage(cvGetSize(input),input->depth,input->nChannels);

assert(out_b_img!=NULL);

IplImage*out_c_img=cvCreateImage(cvGetSize(input),input->depth,input->nChannels);

assert(out_c_img!=NULL);

IplImage*out_d_img=cvCreateImage(cvGetSize(input),input->depth,input->nChannels);

assert(out_d_img!=NULL);

IplImage*out_e_img=cvCreateImage(cvGetSize(input),input->depth,input->nChannels);

assert(out_e_img!=NULL);

IplImage*out_f_img=cvCreateImage(cvGetSize(input),input->depth,input->nChannels);

assert(out_f_img!=NULL);

IplImage*out_g_img=cvCreateImage(cvGetSize(input),input->depth,input->nChannels);

assert(out_g_img!=NULL);

IplImage*out_h_img=cvCreateImage(cvGetSize(input),input->depth,input->nChannels);

assert(out_h_img!=NULL);

IplImage*out_g_h_img=cvCreateImage(cvGetSize(input),input->depth,input->nChannels);

assert(out_g_h_img!=NULL);

IplImage*out_m_img=cvCreateImage(cvGetSize(input),input->depth,input->nChannels);

assert(out_m_img!=NULL);

IplImage*out_n_img=cvCreateImage(cvGetSize(input),input->depth,input->nChannels);

assert(out_n_img!=NULL);

//a.param1=param2=9;param3=1,4,6会随着值的扩大,图像的模糊程度也扩大

cvSmooth(input,out_a_img,CV_GAUSSIAN,9,9,1);

cvSmooth(input,out_b_img,CV_GAUSSIAN,9,9,4);

cvSmooth(input,out_c_img,CV_GAUSSIAN,9,9,6);

//b.param1=param2=0;param3=1,4,6该情况比a情况的模糊程度更大

cvSmooth(input,out_d_img,CV_GAUSSIAN,0,0,1);

cvSmooth(input,out_e_img,CV_GAUSSIAN,0,0,4);

cvSmooth(input,out_f_img,CV_GAUSSIAN,0,0,6);

//c.param1=param2=0;param3=1;param4=9该情况下图像的模糊程度较高,比较刺目,上下模糊程度较高

cvSmooth(input,out_g_img,CV_GAUSSIAN,0,0,1,9);

//d.param1=param2=0;param3=9;param4=1左右模糊程度较高

cvSmooth(input,out_h_img,CV_GAUSSIAN,0,0,9,1);

//e.先用c再用d方法平滑.此处将四个参数全部设为0,会出现错误(和E的处理结果一样)

cvSmooth(out_g_img,out_g_h_img,CV_GAUSSIAN,0,0,9,1);

//第一次设param1=param2=0;param3=param4=9第二次param1=param2=0;param3=param4=0

cvSmooth(input,out_m_img,CV_GAUSSIAN,0,0,9,9);

cvSmooth(out_m_img,out_n_img,CV_GAUSSIAN);

cvNamedWindow("param1=param2=9;param3=1",CV_WINDOW_AUTOSIZE);

cvNamedWindow("param1=param2=9;param3=4",CV_WINDOW_AUTOSIZE);

cvNamedWindow("param1=param2=9;param3=6",CV_WINDOW_AUTOSIZE);

cvNamedWindow("param0=param2=0;param3=1",CV_WINDOW_AUTOSIZE);

cvNamedWindow("param0=param2=0;param3=4",CV_WINDOW_AUTOSIZE);

cvNamedWindow("param0=param2=0;param3=6",CV_WINDOW_AUTOSIZE);

cvNamedWindow("param1=param2=0;param3=1,param4=9",CV_WINDOW_AUTOSIZE);

cvNamedWindow("param1=param2=0;param3=9,param4=1",CV_WINDOW_AUTOSIZE);

cvNamedWindow("first param1=param2=0;param3=1,param4=9,then param1=param2=0;param3=9,param4=1",CV_WINDOW_AUTOSIZE);

cvNamedWindow("first param1=param2=0;param3=param4=9,then param1=param2=0;param3=param4=0",CV_WINDOW_AUTOSIZE);

cvShowImage("param1=param2=9;param3=1",out_a_img);

cvSaveImage("p_a991.jpg",out_a_img);

cvShowImage("param1=param2=9;param3=4",out_b_img);

cvSaveImage("p_a994.jpg",out_b_img);

cvShowImage("param1=param2=9;param3=6",out_c_img);

cvSaveImage("p_a996.jpg",out_c_img);

cvShowImage("param0=param2=0;param3=1",out_d_img);

cvSaveImage("p_b001.jpg",out_d_img);

cvShowImage("param0=param2=0;param3=4",out_e_img);

cvSaveImage("p_b004.jpg",out_e_img);

cvShowImage("param0=param2=0;param3=6",out_f_img);

cvSaveImage("p_b006.jpg",out_f_img);

cvShowImage("param1=param2=0;param3=1,param4=9",out_g_img);

cvSaveImage("p_c0019.jpg",out_g_img);

cvShowImage("param1=param2=0;param3=9,param4=1",out_h_img);

cvSaveImage("p_d1091.jpg",out_h_img);

cvShowImage("first param1=param2=0;param3=1,param4=9,then param1=param2=0;param3=9,param4=1",out_g_h_img);

cvSaveImage("p_e_c_d.jpg",out_g_h_img);

cvShowImage("first param1=param2=0;param3=param4=9,then param1=param2=0;param3=param4=0",out_n_img);

cvSaveImage("p_f.jpg",out_n_img);

cvWaitKey();

cvReleaseImage(&input);

cvReleaseImage(&out_a_img);

cvReleaseImage(&out_b_img);

cvReleaseImage(&out_c_img);

    cvReleaseImage(&out_d_img);

cvReleaseImage(&out_e_img);

cvReleaseImage(&out_f_img);

cvReleaseImage(&out_g_img);

cvReleaseImage(&out_h_img);

    cvReleaseImage(&out_g_h_img);

cvReleaseImage(&out_n_img);

cvDestroyAllWindows();

return 0;

}

效果如下:

输入原图:

关于高斯模糊平滑滤波器的参数探讨的汇总

输出结果:

a)param1=param2=9;param3=1,4,6(分别看下图)会随着值的扩大,图像的模糊程度也扩大。

关于高斯模糊平滑滤波器的参数探讨的汇总
关于高斯模糊平滑滤波器的参数探讨的汇总
关于高斯模糊平滑滤波器的参数探讨的汇总

b)param1=param2=0;param3=1,4,6(分别看下面),该情况比a情况的模糊程度更大

关于高斯模糊平滑滤波器的参数探讨的汇总
关于高斯模糊平滑滤波器的参数探讨的汇总
关于高斯模糊平滑滤波器的参数探讨的汇总

c)param1=param2=0;param3=1;param4=9该情况下图像的模糊程度较高,比较刺目,上下模糊程度较高

关于高斯模糊平滑滤波器的参数探讨的汇总

d)param1=param2=0;param3=9;param4=1左右模糊程度较高

关于高斯模糊平滑滤波器的参数探讨的汇总

e)先用c再用d方法平滑.此处将四个参数全部设为0,会出现错误(和E的处理结果一样)

关于高斯模糊平滑滤波器的参数探讨的汇总

f)第一次设param1=param2=0;param3=param4=9第二次param1=param2=0;param3=param4=0

关于高斯模糊平滑滤波器的参数探讨的汇总