学习DIP第31天
转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不满意。有些网站转载了我的博文,很开心的是自己写的东西被更多人看到了,但不开心的是这段话被去掉了,也没标明转载来源,虽然这并没有版权保护,但感觉还是不太好,出于尊重文章作者的劳动,转载请标明出处!!!!
文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro
废话开始,话说昨天写博客写完了,发表以后居然刷出来的是空白,顿时很生气,因为写了一上午的东西瞬间就没了,于是在微博上吐槽了csdn,于是csdn的官方微博和客服微博都跟我进行了沟通和道歉,感觉态度还是不错的,作为用户没有付给他们钱,但还是受到了不小的重视,感觉还是不错。学习是一个被分享之后经过自己加工后再分享的过程,一个分享的平台是很重要的选择,好的平台能够学到知识,并能分享知识,和别人讨论知识,收集资源分享资源。希望大家共同进步。
图像增强,平滑第二天,虽然说是第二天,但要学习和研究包括写程序,都不是一天完成的。上一篇写的是线性滤波模板,此类模板我们可以叫他们静态模板,因为其只依赖于我们的选择,我们一旦选择完成,模板就唯一确定,不会在卷积的过程中产生变换,所以这类模板具有线性性质,但缺点是不灵活,不能根据不同灰度变化情况来实时的调整权重,双边滤波就是一种非线性模板,能够根据像素位置和灰度差值的不同产生不同的模板,得到不同的滤波结果。
//高斯函数 double gaussian(double x,double deta){ return exp(-0.5*(x*x)/(deta*deta)); } //计算当前模板系数 double BilateralWindow(double *window,int width,int height,double deta_d,double deta_r){ double *mask=(double *)malloc(sizeof(double)*width*height); if(mask==NULL){ printf("bilateral window malloc wrong\n"); exit(0); } GaussianMask(mask,width,height,deta_d); double detavalue=0.0; double center_value=window[height/2*width+width/2]; double k=0.0; double result=0.0; for(int j=0;j<height;j++){ for(int i=0;i<width;i++){ detavalue=center_value-window[j*width+i]; mask[j*width+i]*=gaussian(detavalue,deta_r); k+=mask[j*width+i]; } } for(int i=0;i<width*height;i++){ result+=mask[i]*window[i]; } free(mask); return result/k; } //双边滤波 void BilateralFilter(IplImage *src,IplImage *dst,int width,int height,double deta_d,double deta_r){ double *window=(double *)malloc(sizeof(double)*width*height); for(int j=height/2;j<src->height-height/2;j++){ for(int i=width/2;i<src->width-width/2;i++){ for(int m=-height/2;m<height/2+1;m++){ for(int n=-width/2;n<width/2+1;n++) window[(m+height/2)*width+n+width/2]=cvGetReal2D(src, j+m, i+n); } double value=BilateralWindow(window,width,height,deta_d,deta_r); cvSetReal2D(dst, j, i, value); } } free(window); }