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