学习DIP第35天
转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不满意。有些网站转载了我的博文,很开心的是自己写的东西被更多人看到了,但不开心的是这段话被去掉了,也没标明转载来源,虽然这并没有版权保护,但感觉还是不太好,出于尊重文章作者的劳动,转载请标明出处!!!!
文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro
开篇废话
废话开始,今天写了两篇博客,为了加快学习进度,而且是周末,相当于给自己加个班,而且理论之前已经研究明白了,所以写起来也比较自如。有人在群里问,学习图像处理,要看书还是要写代码还是要作项目,我觉得,看书像是内功心法,写代码相当于招式练习,项目就像实战一样,所以如果只写代码或者一上来就去跟别人做项目而完全不看书研究基础算法就像空中楼阁,美丽但不牢固,更重要的是容易迷失自己,也就是走火入魔,个人观点,本人也在基础练习阶段,所以说这些没什么经验依据,只是自己的理解。
非锐化掩蔽,一开始感觉这个词好难接受,不知道要干嘛,google之发现线索不多,经过一番研究发现这个词这么理解:非锐化--锐化的相反的操作是平滑,所以非锐化就是平滑操作;掩蔽--字面意思是隐藏,其实我们可以把它理解成为减去除去,所以这个过程就是减去平滑后的图像得到的结果。而实际算法的思路是,原图减去平滑后的图像,得到被削弱的边缘部分,然后按照一定比例和原图相加,如果比例为1,那么就是非锐化掩蔽,如果大于1就是高提升滤波,和前面频率域的高提升,高频强调思路一致,只是那部分用的是频率域方法。
数学原理
数学原理与前面的锐化原理基本保持一致,只是在确定细节的方法上有些不同:
1、生成模板,f上有个横的表示f的平滑结果:
2:钝化模板按照一定比例与原图相加:
其中k=1时为非锐化掩蔽。
k>1时为高提升滤波。
示意图
观察示意图:
算法基本步骤:
- 平滑图像,边缘和突变被消减,而平滑部分不变(此处不适合采用边缘保持性好的平滑算法,代码中使用了均值滤波和高斯滤波)。
- 原图像与平滑后图像相减,得到钝化模板。
- 钝化模板的k倍与原图相加得到锐化结果。
值得注意的是,因为钝化模板有负值,所以,如果k选择过大的时候有可能图像产生负值
代码
void UnsharpMasking(double *src,double *dst,int width,int height,int smooth_type,int smooth_mask_width,int smooth_mask_height,double gaussian_deta,double k){ switch (smooth_type) { case SMOOTH_GAUSSIAN: GaussianFilter(src, dst,width,height, smooth_mask_width, smooth_mask_height,gaussian_deta); break; case SMOOTH_MEAN: MeanFilter(src, dst,width,height, smooth_mask_width, smooth_mask_height); break; default: break; } matrixSub(src, dst, dst, width, height); matrixMultreal(dst, dst, k, width, height); matrixAdd(src, dst, dst, width, height); }
结果
实验结果,分别采用高斯滤波和均值滤波,作为平滑算法。
原图:
高斯滤波:
5x5,deta=1,k=1:
钝化模板:
锐化结果:
5x5,deta=1,k=2:
锐化结果:
5x5,deta=2,k=1:
钝化模板:
锐化结果:
5x5,deta=2,k=2:
锐化结果:
7x7,deta=1,k=1:
钝化模板:
锐化结果:
7x7,deta=1,k=2:
锐化结果:
7x7,deta=2,k=1:
钝化模板:
锐化结果:
7x7,deta=2,k=2:
锐化结果:
均值
5x5,k=1:
钝化模板:
锐化结果:
5x5,k=2:
锐化结果:
7x7,k=1:
钝化模板:
锐化结果:
7x7,k=2:
锐化结果:
总结
观察上面结果,发现:
- k越大对细节增强越明显。
- 模板越大会导致增细节被增强的越宽,所以模板大小要适度。
- 被平滑消除的边缘越多,锐化后增强的越多。
下一篇介绍下一阶微分算子
待续。。。