天天看點

關于高斯模糊平滑濾波器的參數探讨的彙總

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

關于高斯模糊平滑濾波器的參數探讨的彙總