高斯处理

对原图进行高斯平滑,去除图像中的计算噪声
void Bmp::MakeGauss(double sigma,double **pdKernel,int *pnWindowSize){
 //循环控制变量
 int i;
 //数组的中心点
 int nCenter;
 //数组的某一点到中心点的距离
 double dDis;
 //中间变量
 double dValue;
 double dSum;
 dSum = 0;

 //数组长度,根据概率论的知识,选取[-3*sigma,3*sigma]以内的数据
 //这些数据会覆盖绝大部分的滤波系数
 *pnWindowSize = 1 + 2*ceil(3*sigma);

 //中心
 nCenter = (*pnWindowSize)/2;
 //分配内存
 *pdKernel = new double[*pnWindowSize];

 //生成高斯数据
 for ( i =0;i<(*pnWindowSize);i++)
 {
  dDis = (double)(i-nCenter);
  dValue = exp(-(1/2)*dDis*dDis/(sigma*sigma))/(sqrt(2*PI)*sigma);
  (*pdKernel)[i]=dValue;
  dSum+=dValue;
 }

 //归一化
 for (i = 0;i<(*pnWindowSize);i++)
 {
  (*pdKernel)[i]/=dSum;
 }
 
}

void Bmp::GaussianSmooth(u8_t *pUnchImg,int nWidth,int nHeight,double sigma,u8_t *pUnchSmthdImg){
 //循环变量
 int y,x,i;
   
 //高斯滤波器的数组长度
 int nWindowSize;
 //窗口长度的1/2
 int nHalfLen;
 //一维高斯数据滤波器
    double *pdKernel;

 //高斯系数与图像数据的点乘
 double dDotMul;
 //高斯滤波系数的总和
 double dWeightSum;
 //中间变量
 double *pdTmp;

 //分配内存
 pdTmp = new double[nWidth*nHeight];

 //产生一维高斯数据滤波器
 MakeGauss(sigma,&pdKernel,&nWindowSize);

 //MakeGauss返回窗口的长度,利用此变量计算窗口的半长
 nHalfLen = nWindowSize/2;

 //x方向进行滤波
 for (y=0;y<nHeight;y++)
 {
  for (x=0;x<nWidth;x++)
  {
   dDotMul = 0;
   dWeightSum = 0;
   for (i=(-nHalfLen);i<=nHalfLen;i++)
   {
    //判断是否在图像内部
    if ((i+x)>=0 && (i+x)<nWidth)
    {
     //利用高斯系数对图像数据滤波
     dDotMul += (double)pUnchImg[y*nWidth + (i+x)] * pdKernel[nHalfLen+i];
        dWeightSum += pdKernel[nHalfLen + i];
    }
   }
   pdTmp[y*nWidth+x]=dDotMul/dWeightSum;
   //pUnchSmthdImg[y*nWidth+x]=(u8_t)(int)dDotMul/dWeightSum;
  }//end for x
 }//end for y

    //y方向进行滤波
 for (x=0;x<nWidth;x++)
 {
  for (y=0;y<nHeight;y++)
  {
   dDotMul = 0;
   dWeightSum = 0;
   for (i=(-nHalfLen);i<=nHalfLen;i++)
   {
    //判断是否在图像内部
    if ((i+y)>=0 && (i+y)<nHeight)
    {
     //利用高斯系数对图像数据滤波
     dDotMul += (double)pdTmp[(y+i)*nWidth + x] * pdKernel[nHalfLen+i];
        dWeightSum += pdKernel[nHalfLen + i];
    }
   }
   pUnchSmthdImg[y*nWidth+x]=(u8_t)(int)dDotMul/dWeightSum;
  }//end for y
 }//end for x
 
 //释放内存
 delete[]pdKernel;
 pdKernel = NULL;
 delete[]pdTmp;
 pdTmp = NULL;

 

main(){

 u8_t **new_temp_data;
 u8_t *new_temp;
 u32_t width,height;
 width = bmp_head->img_head->width;
 height = bmp_head->img_head->height;
 new_temp_data = (u8_t **)malloc((u32_t)width*height);
 memset(new_temp_data,(u8_t)255,(u32_t)width*height);
 new_temp = (u8_t *)new_temp_data;
 memcpy(new_temp_data,bmp_head->buf,(u32_t)width*height);

 GaussianSmooth((u8_t *)bmp_head->buf,width,height,0.05,new_temp);
 bmp_head->buf = new_temp_data;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值