圖像銳化算法(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 \{\begin{aligned} S(i,j)+amount*value, && abs(value)>threshold \\ S(i,j), & & otherwise \end{aligned} \right. \]

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

論文地址

不過上述方法計算復雜,所以具體應用時還應取舍。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM