圖像銳化算法(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:
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\)上,使得增強因子和位置相關,而非全局的一個常數:
- paper:An image sharpening algorithm based on fuzzy logic
- paper:Nonlinear unsharp masking methods for image contrast enhancement
- paper:rational unsharp masking technique
- paper:Image Enhancement via Adaptive Unsharp Masking
不過上述方法計算復雜,所以具體應用時還應取舍。