图像锐化算法 C++ 实现

之前一段我们提到的算法都是和平滑有关, 经过平滑算法之后, 图像锐度降低, 降低到一定程度, 就变成了模糊。 今天我们反其道行之, 我们看看锐化是怎么做的。 这里的锐化, 还是的从平滑谈开去。我们先来观察原来的图像和平滑图像的区别:

 

原图 raw

                           raw

减去模糊图 blur

                           blur

_________________________________________________________

等于 mask

                           mask        

 

 

这个时候, 我们发现,减法做完的这个图赫然勾勒出了原图的边缘!! 这样给我们一个启示就是, 如果我们把这个mask加到原图上那岂不就是锐化了? (不明白? 锐化的意思就是边缘的色差比较大, 产生的图片貌似清晰的效果) 说干就干, 马上我们来做个新的算式:

 

老图 raw:

                            raw

+ 加上mask

                            mask

_______________________________________________________

等于锐化图  sharpen

                            sharp

 

怎么样, 是不是有了锐化的效果了??所以我们实际上的锐化效果就是从这么简单的想法衍生出来的。 所以锐化的公式可以简单的表述为 sharp = raw + ( raw-blur ); 再来看看我们原来的高斯模版的话就是这样:

formula

这样的话, 我们的锐化算法,也变得和之前的高斯平滑差不多了, 就是像素的加权平均值的计算就可以得到了。可以想见的事情是代码肯定也会出奇的一致! 这是那个template改掉了:

[cpp]  view plain copy
  1. /** 
  2. ** method to remove sharp the raw image with unsharp mask 
  3. * @param gray input grayscale binary array  
  4. * @param smooth output data for smooth result, the memory need to be allocated outside of the function 
  5. * @param width width of the input grayscale image 
  6. * @param height height of the input grayscale image 
  7. */  
  8. void sharpenImage  (unsigned char* gray, unsigned char* smooth, int width, int height)  
  9. {  
  10.       
  11.     int templates[25] = { -1, -4, -7, -4, -1,   
  12.         -4, -16, -26, -16, -4,   
  13.         -7, -26, 505, -26, -7,  
  14.         -4, -16, -26, -16, -4,   
  15.         -1, -4, -7, -4, -1 };         
  16.     memcpy ( smooth, gray, width*height*sizeof(unsigned char) );  
  17.     for (int j=2;j<height-2;j++)  
  18.     {  
  19.         for (int i=2;i<width-2;i++)  
  20.         {  
  21.             int sum = 0;  
  22.             int index = 0;  
  23.             for ( int m=j-2; m<j+3; m++)  
  24.             {  
  25.                 for (int n=i-2; n<i+3; n++)  
  26.                 {  
  27.                     sum += gray [ m*width + n] * templates[index++] ;  
  28.                 }  
  29.             }  
  30.             sum /= 273;  
  31.             if (sum > 255)  
  32.                 sum = 255;  
  33.             if (sum <0)  
  34.                 sum = 0;  
  35.             smooth [ j*width+i ] = sum;  
  36.         }  
  37.     }  
  38. }  

当然, 这个锐化算法或者说锐化的模板只是我根据前面的算式自己计算的来的,其实还是有非常主流的锐化模版可以供使用的, 比如说著名的拉普拉斯算子. 点开这些类似的网页你也可以获取一些有用的信息:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值