• 数字图像处理,图像锐化算法的C++实现


    http://blog.csdn.net/ebowtang/article/details/38961399

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

    原图 raw:

     raw

    模糊图 blur:

     blur

    _________________________________________________________

    源图像减去模糊图像等于 锐化后的边缘mask效果:

     mask        

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

    老图 raw:

      raw

    加上mask

      mask

    _______________________________________________________

    等于锐化图  sharpen

      sharp

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

    formula

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

    [html] view plain copy
     
     print?
    1. void sharpenImage  (unsigned char* gray, unsigned char* smooth, int width, int height)    
    2. {    
    3.         
    4.     int templates[25] = { -1, -4, -7, -4, -1,     
    5.         -4, -16, -26, -16, -4,     
    6.         -7, -26, 505, -26, -7,    
    7.         -4, -16, -26, -16, -4,     
    8.         -1, -4, -7, -4, -1 };           
    9.     memcpy ( smooth, gray, width*height*sizeof(unsigned char) );    
    10.     for (int j=2;j<height-2;j++)    
    11.     {    
    12.         for (int i=2;i<width-2;i++)    
    13.         {    
    14.             int sum = 0;    
    15.             int index = 0;    
    16.             for ( int m=j-2; m<j+3; m++)    
    17.             {    
    18.                 for (int n=i-2; n<i+3; n++)    
    19.                 {    
    20.                     sum += gray [ m*width + n] * templates[index++] ;    
    21.                 }    
    22.             }    
    23.             sum /= 273;    
    24.             if (sum > 255)    
    25.                 sum = 255;    
    26.             if (sum <0)    
    27.                 sum = 0;    
    28.             smooth [ j*width+i ] = sum;    
    29.         }    
    30.     }    
    31. }    

    当然, 这个锐化算法或者说锐化的模板只是我根据前面的算式自己计算的来的,其实还是有非常主流的锐化模版可以供使用的, 比如说著名的拉普拉斯算子。

    参考资源:

    【1】http://blog.csdn.NET/hhygcy/article/details/4330939

  • 相关阅读:
    jQuery中Ajax事件beforesend及各参数含义 转
    如何组织好js代码 转
    C# 几种HtmlEncode的区别
    [转]建议Font-Size使用em单位控制大小
    JavaScript charAt() 方法
    Js中 关于top、clientTop、scrollTop、offsetTop的用法
    jquery mobile 的4个初始化事件
    JS操作JSON总结
    .html(),.text()和.val()的使用
    netstat 显示当前网络连接的统计信息
  • 原文地址:https://www.cnblogs.com/jukan/p/7067699.html
Copyright © 2020-2023  润新知