()代码实现

对原图进行高斯平滑,去除图像中的计算噪声
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;

}

http://blog.csdn.net/yang1994/article/details/1492815 高斯完整调用

()产生理论

void MakeGauss()
{
 double sigma = 1.4;     // σ是正态分布的标准偏差 这里为 1.4
 double dResult[5][5];    // 用于存储结果
 double dResult1[5][5];    // 用于存储结果
 
 // 数组的中心点
 int nCenterX = 2, nCenterY = 2;  // 中心点位置以1开始的吧
 int nSize = 5;
 // 数组的某一点到中心点的距离
 double  dDis; 
 double PI = 3.1415926535;
 // 中间变量
 double  dValue; 
 double  dSum  ;
 dSum = 0 ; 
 int i, j;
 
 for(i = 0; i< nSize; ++i)
 {
  for(j = 0; j < nSize; ++j)
  {
   dDis = (i - nCenterX) * (i - nCenterX) + (j  - nCenterY) * (j - nCenterY);
   dValue = exp( - dDis / (2 * sigma * sigma)) /
       (2 * PI * sigma * sigma);
   dResult[i][j] = dValue;
   dSum += dValue;
  }
 }
 // 归一化
 for(i = 0; i< nSize; ++i)
 {
  for(j = 0; j < nSize; ++j)
  {
   dResult1[i][j] = dResult[i][j] / dSum;
  }
 }
 std::cout << dSum << std::endl;
 for(i = 0; i< nSize; ++i)
 {
  for(j = 0; j < nSize; ++j)
  {
   // dResult1才是高斯的结果, 但是dResult * 1.95 * 100却得到了文章上说的结果
// 一个标准差为1.4的高斯5x5的卷积核
   // 暂时不知道为什么。
   std::cout << (int)(dResult[i][j] * 1.95 * 100) << "  ";
  }
  std::cout << std::endl;
 }
}
void Gauss()
{
    int h_size;
 float siz,sigma;
 int i, j;
 printf("Please input size of gaussian core/n");
 scanf("%d",&h_size);
 printf("Please input sigma:/n");
 scanf("%f",&sigma);
 siz=(h_size-1)/2;
 float **a,**b;
 a=new float*[h_size];
  for(int i=0;i<h_size;i++)   a[i]=new float[h_size];
 b=new float*[h_size];
     for( i=0;i<h_size;i++)   b[i]=new float[h_size];
 for(i=0;i<h_size;i++)
 {
  for(j=0;j<h_size;j++)
  {
   a[i][j]=-siz+j;
   printf("%4.2f ",a[i][j]);
  }
  printf("/n");
 }
 printf("/n");
 for( i=0;i<h_size;i++)
 {
  for(j=0;j<h_size;j++)
  {
   b[i][j]=a[j][i];
   printf("%4.2f ",b[i][j]);
  }
  printf("/n");
 }
 printf("/n");
 float h_sum=0;
 for( i=0;i<h_size;i++)
 {
  for(j=0;j<h_size;j++)
  {
   a[i][j]=a[i][j]*a[i][j];
   b[i][j]=b[i][j]*b[i][j];
   a[i][j]=-(a[i][j]+b[i][j])/(2*sigma*sigma);
   a[i][j]=exp(a[i][j]);
   if(a[i][j]<0.0001) a[i][j]=0;
   h_sum=h_sum+a[i][j];
  }
 }
 
 for(i=0;i<h_size;i++)
 {
  for(j=0;j<h_size;j++)
  {
   a[i][j]=a[i][j]/h_sum;
  }
 }
 for(i=0;i<h_size;i++)
 {
  for(j=0;j<h_size;j++)
  {
   printf("%4.4f ",a[i][j]);
  }
  printf("/n");
 }
}

http://blog.sina.com.cn/s/blog_71fa0df50100wodv.html

()高斯滤波器参数的确定

http://tsindahui.blog.sohu.com/166075850.html

opencv的实现,在cvFilter.cpp的init_gaussian_kernel函数中:

sigmaX = sigma > 0 ? sigma : (n/2 – 1)*0.3 + 0.8;

彩色图像的高斯平滑处理

()图文说明

http://www.ruanyifeng.com/blog/2012/11/gaussian_blur.html

()维基百科和中文百科

http://en.wikipedia.org/wiki/Convolution

http://www.zwbk.org/MyLemmaShow.aspx?lid=126233

()二维优化

http://www.cnblogs.com/easymind223/archive/2012/11/13/2768680.html

http://blog.csdn.net/lanbing510/article/details/28696833

图像处理之基础---滤波器之高斯低通滤波器的高斯模板生成c实现的更多相关文章

  1. 图像处理之基础---滤波器之高斯低通滤波器3c代码实现yuv,rgb

    ()高斯理论简介 () ()代码实现 四 使用高斯滤波器进行图像的平滑 ()高斯简介 http://research.microsoft.com/en-us/um/people/kahe/eccv10 ...

  2. Django基础三之路由、视图、模板

    Django基础三之路由.视图.模板 目录 Django基础三之路由.视图.模板 1. Django 请求和返回周期 1.1 路由层之路由匹配 1.2 有名分组 1.3 无名分组 2. 反射解析 3. ...

  3. OpenCV探索之路(二):图像处理的基础知识点串烧

    opencv图像初始化操作 #include<opencv2\opencv.hpp> #include<opencv2\highgui\highgui.hpp> using n ...

  4. matlab数字图像处理 入门基础

    本代码基于张铮主编的<数字图像处理与机器视觉>一书. 源图片:lena A = imread ('lena.jpg'); %读入图像lena.jpg,赋给变量A %imwrite(A,'l ...

  5. 机器学习进阶-阈值与平滑-图像平滑操作(去噪操作) 1. cv2.blur(均值滤波) 2.cv2.boxfilter(方框滤波) 3. cv2.Guassiannblur(进行高斯滤波) 4. cv2.medianBlur(进行中值滤波)

    1.cv2.blur(img, (3, 3))  进行均值滤波 参数说明:img表示输入的图片, (3, 3) 表示进行均值滤波的方框大小 2. cv2.boxfilter(img, -1, (3, ...

  6. 图像处理之基础---彩色转灰度算法优化rgb to yuv

    File:      StudyRGB2Gray.txtName:      彩色转灰度算法彻底学习Author:    zyl910Version:   V1.0Updata:    2006-5- ...

  7. 图像处理之基础---yuv420及其rgb,bayer, yuv, RGB的相互转换详解

    YUV格式解析1(播放器——project2) 根据板卡api设计实现yuv420格式的视频播放器 打开*.mp4;*.264类型的文件,实现其播放. 使用的视频格式是YUV420格式   YUV格式 ...

  8. Matlab图像处理——中值滤波medfilt2问题解决

    本文链接:https://blog.csdn.net/Pxzly1117/article/details/79201772程序: I=imread('13.jpg');%读入图像imshow(I);h ...

  9. 图像处理------Mean Shift滤波(边缘保留的低通滤波)

    一:Mean Shift算法介绍 Mean Shift是一种聚类算法,在数据挖掘,图像提取,视频对象跟踪中都有应用.本文 重要演示Mean Shift算法来实现图像的低通边缘保留滤波效果.其处理以后的 ...

随机推荐

  1. make、makefile

    http://blog.csdn.net/wed110/article/details/34853475 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows ...

  2. 布尔上下文,这里misreading返回的是来源列表中元素的个数,如果列表中2个值都是undef,则列表元素个数是1: while( $misreading = (my $test_consideration, my $english_pragma) = each %map_function){

    布尔上下文,这里misreading返回的是来源列表中元素的个数, 列表赋值运算的值将会是来源列表中元素的个数,空列表表示0,如果列表中2个值都是undef,则列表元素个数是1 布尔上下文,这里mis ...

  3. PHP 下基于 php-amqp 扩展的 RabbitMQ 简单用例 (五) -- 自动 ACK、手动 ACK、NACK

    以 Direct 类型的 交换机和 Queue 的 get 方法为例. producer.php // 连接设置 $conConfig = [ 'host' => '127.0.0.1', 'p ...

  4. sql 触发器 针对一张表数据写入 另一张表 的增删改

    ALTER TRIGGER [dbo].[tri_test2] ON [dbo].[student] for INSERT,DELETE,UPDATEAS BEGIN if not exists (s ...

  5. react-native 手势响应以及触摸事件的处理

    react-native 的触摸事件: TouchableHighlight , TouchableNativeFeedBack , TouchableOpacity , TouchableWitho ...

  6. jquery toggle()设置

    很多朋友对jquery toggle()比较熟练,甚至经常用到,而且对toggle的三个参数也比较了解$(selector).toggle(speed,callback,switch).但是当你设置$ ...

  7. js读取文本内容,支持csv.txt

    js读取文本内容,支持csv.txt <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...

  8. 4.model 字段

    一.字段名 字段名 类型 参数 AutoField(Field) - int自增列, 必须填入参数 primary_key=True BigAutoField(AutoField) - bigint自 ...

  9. prop 和 attr 中一些羞羞的事情

    引言 前几天做一个迷你京东小项目的时候涉及到一个全选的小功能,一开始用的是 attr,但是效果完全不是自己想要的,当商品按钮点击过一次后,attr就无法对其状态进行更改,最后谷歌了一番发现需要用 pr ...

  10. wps填充1到1000

    A1单元格1 ,选中,填充,序列,确定