高斯滤波 openCV实现

学会任务分解:

task:

1.学会用Opencv打开图片
2.学会用Opencv做一下高斯滤波,看看这个高斯滤波是什么效果,并学一下高斯滤波的理论
3.找一个高斯滤波的C语言程序,结合高斯滤波的理论,将这个程序一定吃透

高斯滤波:

高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,高斯滤波就是对整幅图像进行 加权平均的过程,每一个 像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。
3*3模板 5*5模板
 

g(x,y)={f(x-1,y-1)+f(x-1,y+1)+f(x+1,y-1)+f(x+1,y+1)+[f(x-1,y)+f(x,y-1)+f(x+1,y)+f(x,y+1)]*2+f(x,y)*4}/16;
其中,f(x,y)为图像中(x,y)点的灰度值,g(x,y)为该点经过高斯滤波后的值。

opencv实现:

#include "stdafx.h"
#include "highgui.h"
#include "cv.h" 
//高斯滤波函数,在opencv里可以使用cvSmooth  
void gaussianFilter(uchar* data, int width, int height) 
 {      int i, j, index, sum; 
     int templates[9] = { 1, 2, 1, 
                         2, 4, 2, 
                          1, 2, 1 };//模板的值 
     sum = height * width * sizeof(uchar);//图像所占内存的大小 
     uchar *tmpdata = (uchar*)malloc(sum); 
     memcpy((char*)tmpdata,(char*)data, sum); 
    for(i = 1;i < height - 1;i++) 
     { 
         for(j = 1;j < width - 1;j++) 
        {           
			 index = sum = 0; 
             for(int m = i - 1;m < i + 2;m++) 
             { 
                for(int n = j - 1; n < j + 2;n++) 
                 { 
                    sum += 
                        tmpdata[m * width + n] * 
                         templates[index++];  //处理 
                } 
             } 
            data[i * width + j] = sum / 16; 
		
        } 
     } 
    free(tmpdata); 
 } 



void imgOperate( IplImage* image )
{
    cvNamedWindow( "image-in", CV_WINDOW_AUTOSIZE );
    cvNamedWindow( "image-out", CV_WINDOW_AUTOSIZE);
    cvShowImage( "image-in", image );
	/*
    IplImage* out = cvCreateImage(
        cvGetSize(image),
        IPL_DEPTH_8U,
        3
    );
	*/
	
	//将色彩图像强制转化为灰度图像
	IplImage* pGrayImg=NULL; 

    pGrayImg=cvCreateImage(cvGetSize(image),8,1);   
	cvCvtColor(image,pGrayImg,CV_RGB2GRAY);
  //  cvSmooth( image, out, CV_GAUSSIAN, 5,5 );


   gaussianFilter((unsigned char*)pGrayImg->imageData,pGrayImg->width,pGrayImg->height);
    cvShowImage( "image-out", pGrayImg );

    cvReleaseImage( &pGrayImg );
    cvWaitKey( 0 ); 
    cvDestroyWindow("image-in" );
    cvDestroyWindow("image-out" );    
}
int main( int argc, char** argv )
{
  IplImage* img = cvLoadImage("d:\\1.jpg");
  imgOperate( img );
  cvReleaseImage( &img );
  return 0;
}



 

效果比较:


 

你可能感兴趣的:(图像处理算法,OpenCV,OpenGL,ES)