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

Posted 浩瀚之水_csdn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图像锐化算法(Image sharpening):拉普拉斯增强和Unsharp Masking(附代码)相关的知识,希望对你有一定的参考价值。

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

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

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

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)={S(i,j)+amount∗value,S(i,j),abs(value)>thresholdotherwiseD(i,j)={S(i,j)+amount∗value,abs(value)>thresholdS(i,j),otherwise

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(见下图)

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

  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

论文地址

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

桔桔桔桔桔桔桔桔桔桔

以上是关于图像锐化算法(Image sharpening):拉普拉斯增强和Unsharp Masking(附代码)的主要内容,如果未能解决你的问题,请参考以下文章

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

拉普拉斯锐化(Laplacian sharpening)

python使用openCV图像加载(转化为灰度图像)使用filter2D函数对图像进行锐化(Sharpen Images)

OpenCV之图像锐化

OpenCV之图像锐化

多尺度空间-光谱相互作用Transformer:Pan-Sharpening