织梦CMS - 轻松建站从此开始!

罗索

图像锐化算法 C++ 实现 [基于模板]

落鹤生 发布于 2012-03-07 09:23 点击:次 
之前一段我们提到的算法都是和平滑有关, 经过平滑算法之后, 图像锐度降低, 降低到一定程度, 就变成了模糊。 今天我们反其道行之, 我们看看锐化是怎么做的。 这里的锐化, 还是的从平滑谈开去。
TAG:

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

原图 raw

减去模糊图 blur

_________________________________________________

等于 mask

        

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

老图 raw:

+ 加上mask

_______________________________________________________

等于锐化图  sharpen

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

 

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

/** 
** method to remove sharp the raw image with unsharp mask 
* @param gray input grayscale binary array  
* @param smooth output data for smooth result,the memory need to be allocated outside of the func
* @param width width of the input grayscale image 
* @param height height of the input grayscale image 
*/ 
void sharpenImage  (unsigned char* gray, unsigned char* smooth, int width, int height) 

     
    int templates[25] = { -1, -4, -7, -4, -1,  
        -4, -16, -26, -16, -4,  
        -7, -26505, -26, -7
        -4, -16, -26, -16, -4,  
        -1, -4, -7, -4, -1 };         
    memcpy ( smooth, gray, width*height*sizeof(unsigned char) ); 
    for (int j=2;j<height-2;j++) 
    { 
        for (int i=2;i<width-2;i++) 
        { 
            int sum = 0
            int index = 0
            for ( int m=j-2; m<j+3; m++) 
            { 
                for (int n=i-2; n<i+3; n++) 
                { 
                    sum += gray [ m*width + n] * templates[index++] ; 
                } 
            } 
            sum /= 273
            if (sum > 255
                sum = 255
            if (sum <0
                sum = 0
            smooth [ j*width+i ] = sum; 
        } 
    } 

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

http://www.cgafaq.info/wiki/Image_Sharpening_and_Blurring

http://www.spatialanalysisonline.com/output/html/Linearspatialfiltering.html

(hhygcy)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201203/15791.html]
本文出处:CSDN博客 作者:hhygcy 原文
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容