zoukankan      html  css  js  c++  java
  • 图像锐化算法(Image sharpening):拉普拉斯增强和Unsharp Masking(附代码)

    图像锐化算法(Image sharpening):拉普拉斯增强和Unsharp Masking(附代码)

    (y(m,n)=x(m,n)+lambda*z(m,n))
    其中(x(m,n))是处理前图片,(y(m,n))是锐化后,(z(m,n))代表增强图像的边缘和细节(高频部分),(lambda)是增强因子,如下图所示:

    1.laplacian 增强

    def laplacianSharpen(im, alpha):
        k = np.array([[0, 0, 0, ], [0, 1, 0], [0, 0, 0]])+alpha * 
            np.array([[0, -1, 0], [-1, 4, -1], [0, -1, 0]])
        # k = np.array([[-1, -1, -1], [-1, 9, -1], [-1, -1, -1]])
        dst = cv2.filter2D(im, -1, k)
    
        return dst
    

    注:当然(lambda)也可以不固定为1,原图像加上(lambda)乘拉普拉斯锐化的结果,(lambda)控制增强效果,如果觉得过于锐利,可以调小一点。

    2.usm和改进usm

    usm(unsharp masking):将原图像低通滤波后产生一个模糊图像,原图像与这模糊图像相减得到保留高频成份的图像。再将高频图像用一个参数放大后与原图像叠加,得到增强的图像。

    def usmSharpen(src,m,sigma,amount):
        blur_img = cv2.GaussianBlur(src, (m, m), sigma)
        dst = cv2.addWeighted(src, 1+amount, blur_img, -1*amount, 0)
    
        return dst
    

    improved usm:
    1.假设原图为S,以半径r计算高斯模糊图G
    2.value=S(i,j)-G(i,j)
    3.锐化后的图为D:

    [D(i,j)=left {egin{aligned} S(i,j)+amount*value, && abs(value)>threshold \ S(i,j), & & otherwise end{aligned} ight. ]

    def improveUSM(src, m, sigma, threshold, amount):
        blur = cv2.GaussianBlur(src, (m, m), sigma)
        diff = src-blur
        mask = diff < threshold
        dst = cv2.addWeighted(src, 1+amount, blur, -1*amount, 0)
    
        res = src*mask+dst*(1-mask)
    
        return res
    

    注:在使用改进usm时发现出现黑点(尤其是参数高斯模糊半径m变很大时),因为对黑暗区域的增强带来的感觉上更加明显(韦伯定律),所以可以对value为负值时使用更小的增强因子。

    def improveUSM2(src, m, sigma, threshold, amount):
        '''
        reduce  black specles
        '''
        blur = cv2.GaussianBlur(src, (m, m), sigma)
        diff = src-blur
        mask = cv2.convertScaleAbs(diff) < threshold
        dst = np.zeros_like(src, dtype=np.int16)
        src = src.astype(np.int16)
        blur = blur.astype(np.int16)
        diff2 = src-blur
        mask2 = diff2 < 0
        neg = diff2*mask2
        pos = diff2*(1-mask2)
    
        dst = src+amount*pos+amount*0.5*neg
        dst = dst.clip(0, 255)
    
        return dst2
    

    另一种usm的优化:
    根据阈值比较结果,处理更平滑自然(主要是对mask做了模糊处理)

    def improveUSM3(src, m, sigma, threshold, amount):
        blur = cv2.GaussianBlur(src, (m, m), sigma)
        diff = src-blur
        mask = diff < threshold
        dst = cv2.addWeighted(src, 1+amount, blur, -1*amount, 0)
    
        mask = mask.astype(np.int16)
        mask2 = cv2.GaussianBlur(mask, (m, m), sigma)
        res = src*mask2+dst*(1-mask2)
    
        return res
    

    3.其他改进

    two drawbacks of USM:
    1.noise amplification(噪声也属于高频部分,所以增强细节同时会增强噪声)
    2.overshoot effect(见下图)

    改进思路,无非是从(lambda)(z(m,n))两个方面去优化,下面几篇论文,第一篇改进usm的根据阈值截断处理,使用更平滑的处理方式,第二篇是从改变(z(m,n))的计算上,使用非线性核(二次滤波器和多项式滤波器)。第三篇和第四篇是从优化(lambda)上,使得增强因子和位置相关,而非全局的一个常数:

    1. paper:An image sharpening algorithm based on fuzzy logic
    2. paper:Nonlinear unsharp masking methods for image contrast enhancement
    3. paper:rational unsharp masking technique
    4. paper:Image Enhancement via Adaptive Unsharp Masking

    论文地址

    不过上述方法计算复杂,所以具体应用时还应取舍。

  • 相关阅读:
    asp.net区
    推荐大家一个保护视力的Visual Studio皮肤
    微软Team Foundation Server相关技术
    TFS2008安装图解(详细版本)
    VS2008 ,TFS2008破解序列号
    分析器错误信息: 发现不明确的匹配。
    ASP.NET MVC Routing概述
    软件工程文档编写
    Visual SourceSafe学习小结
    aspnetpager 详解 (转)
  • 原文地址:https://www.cnblogs.com/buyizhiyou/p/12979770.html
Copyright © 2011-2022 走看看