图像的高斯平滑C++实现

来源:互联网 发布:淘宝ipad为什么便宜 编辑:程序博客网 时间:2024/05/16 06:18
#include<iostream>#include<highgui\highgui.hpp>#include<core/core.hpp>  using namespace cv;  using namespace std;  void GetGuassFilter(float* pfGaussFilter, const int iFilterHeight, const int iFilterWidth, const float fSigma){    cout<<"pfGaussFilter"<<endl;    for(int i=0;i<iFilterHeight;i++)    {        for(int j=0;j<iFilterWidth;j++)        {            pfGaussFilter[i*iFilterHeight+j]=1.0/exp(((i-iFilterHeight/2)^2+(j-iFilterWidth)^2));            //pfGaussFilter[i*iFilterWidth+j]=1.0/25.0;            //cout<<pfGaussFilter[i*iFilterWidth+j]<<" ";        }        cout<<endl;    }    float sum=0;    for(int j=0;j<iFilterWidth*iFilterHeight;j++)    {        sum+=pfGaussFilter[j];    }    for(int j=0;j<iFilterHeight*iFilterWidth;j++)    {        pfGaussFilter[j]=pfGaussFilter[j]/sum;    }}void GaussFilt2D(uchar* pSrc, uchar* pDst, const int iHeight, const int iWidth,                 const int iFilterHeight, const int iFilterWidth, const float fSigma){    float* pfGaussFilter=new float[iFilterHeight*iFilterWidth];    GetGuassFilter(pfGaussFilter,iFilterHeight,iFilterWidth,fSigma);    float sum=0;    int index=0;    float current_src=0;    for(int i=-iFilterHeight;i<iHeight-1;i++)        for(int j=-iFilterWidth;j<iWidth-1;j++)        {            sum=0;            index=0;            for(int m=i-iFilterHeight/2;m<i+iFilterHeight/2+1;m++)            {                for(int n=j-iFilterWidth/2;n<j+iFilterWidth/2+1;n++)                {                    if(m<0||n<0||m>iHeight-1||n>iWidth-1)                        continue;                    current_src=(float)pSrc[m*iWidth+n];                    sum+=current_src*pfGaussFilter[index++];                }            }            if(i+iFilterHeight/2>0&&i+iFilterHeight/2<iHeight-1&&j+iFilterWidth/2>0&&j+iFilterWidth/2<iWidth-1)                pDst[(i+iFilterHeight/2)*iWidth+j+iFilterWidth/2]=(uchar)sum;            //pDst[i*iWidth+j]=(uchar)sum;            if(pDst[i*iWidth+j]<0)                pDst[i*iWidth+j]=0;            if(pDst[i*iWidth+j]>255)                pDst[i*iWidth+j]=255;        }}void GaussFilt2DFull(uchar* pSrc, uchar* pDst, const int iHeight, const int iWidth,                 const int iFilterHeight, const int iFilterWidth, const float fSigma){    float* pfGaussFilter=new float[iFilterHeight*iFilterWidth];    GetGuassFilter(pfGaussFilter,iFilterHeight,iFilterWidth,fSigma);    float sum=0;    int index=0;    float current_src=0;    for(int i=0;i<iHeight-1;i++)        for(int j=0;j<iWidth-1;j++)        {            sum=0;            index=0;            for(int m=i-iFilterHeight/2;m<i+iFilterHeight/2;m++)                for(int n=j-iFilterWidth/2;n<j+iFilterWidth/2;n++)                {                    if(m<0||n<0||m>iHeight-1||n>iWidth-1)                        continue;                    current_src=(float)pSrc[m*iWidth+n];                    sum+=current_src*pfGaussFilter[index++];                }            //if(i+iFilterHeight/2>0&&i+iFilterHeight/2<iHeight-1&&j+iFilterWidth/2>0&&j+iFilterWidth/2<iWidth-1)            pDst[i*iWidth+j]=(uchar)sum;            //pDst[i*iWidth+j]=(uchar)sum;            if(pDst[i*iWidth+j]<0)                pDst[i*iWidth+j]=0;            if(pDst[i*iWidth+j]>255)                pDst[i*iWidth+j]=255;        }}int main()  {  //读入图片,注意图片路径      //Mat image=imread("D:\\Picture\\lena.jpg");      //Mat image=imread("E:\\Projects\\MyOpenCV\\MyOpenCV\\1.png");     Mat image=imread("C:\\迅雷下载\\图像处理\\Projects\\MyOpenCV\\MyOpenCV\\DIP3ECH06\\Fig0638(a)(lenna_RGB).tif",0);     Mat image_Dst=imread("C:\\迅雷下载\\图像处理\\Projects\\MyOpenCV\\MyOpenCV\\DIP3ECH06\\Fig0648(b)(lenna-noise-G-gauss-mean0-var800).tif",0);     //Mat image=imread("E:\\Projects\\MyOpenCV\\MyOpenCV\\DIP3ECH06\\Fig0635(middle_row_left_chalk ).tif",0);    //Mat image_Dst=imread("E:\\Projects\\MyOpenCV\\MyOpenCV\\DIP3ECH06\\Fig0635(middle_row_left_chalk ).tif",0);    const int iHeight=image.rows;    const int iWidth=image.cols;    uchar* pSrc=image.data;//new uchar[iHeight*iWidth];    uchar* pDst=image_Dst.data;//new uchar[iHeight*iWidth];    //GaussFilt2D(pSrc,pDst,iHeight,iWidth,5,5,1);    GaussFilt2DFull(pSrc,pDst,iHeight,iWidth,25,25,1);    namedWindow("Origin",1);    imshow("Origin",image);    //创建一个名字为“Lena”的图像显示窗口,(不提前声明也可以)      namedWindow("Lena",1);      //显示图像      imshow("Lena",image_Dst);      //等待按键      waitKey();      return 0;  }  

左图为原始灰度图,右图为高斯滤波后图像。可以看出图像边缘有黑框,是因为在原图像外区域补零的原因

1 0
原创粉丝点击