1、算法原理
多尺度细节提升算法来源于论文*《DARK IMAGE ENHANCEMENT BASED ON PAIRWISE TARGET CONTRAST AND MULTI-SCALE DETAIL BOOSTING》*,算法主要是解决细节增强算法中噪声和细节的平衡问题。
常规的非锐化掩蔽(USM)算法在提升细节的同时,会将噪声分量放大。多尺度细节提升算法,利用噪声分量在不同高斯尺度滤波的情况下,响应值基本一致,但是,真正的边缘细节分量,会随着高斯滤波的尺度加大,响应值将会变化。因此,作者巧妙地利用这个特征,使用不同尺度的高斯滤波结果相减,从而分离出噪声、细节。
算法步骤:
设输入原始图像为
I
∗
I^*
I∗,不同尺度的高斯滤波器为
G
1
,
G
2
,
G
3
G_{1},G_{2},G_{3}
G1,G2,G3,尺度系数设置为:1.0、2.0、4.0。
(1)、使用不同的尺度的高斯滤波器,对图像进行滤波。
B
1
=
G
1
∗
I
∗
,
B
2
=
G
2
∗
I
∗
,
B
3
=
G
3
∗
I
∗
B_{1}=G_{1}*I^{*},\quad B_{2}=G_{2}*I^{*},\quad B_{3}=G_{3}*I^{*}
B1=G1∗I∗,B2=G2∗I∗,B3=G3∗I∗
(2)、对不同尺度的高斯滤波结果做差,分离出不同分量的细节。
D
1
=
I
∗
−
B
1
,
D
2
=
B
1
−
B
2
,
D
3
=
B
2
−
B
3
D_{1}=I^{*}-B_{1},D_{2}=B_{1}-B_{2},D_{3}=B_{2}-B_{3}
D1=I∗−B1,D2=B1−B2,D3=B2−B3
(3)、不同分量的细节加权融合。
D ∗ = ( 1 − w 1 × s g n ( D 1 ) ) × D 1 + w 2 × D 2 + w 3 × D 3 D^*=(1-w_1\times\mathrm{sgn}(D_1))\times D_1+w_2\times D_2+w_3\times D_3 D∗=(1−w1×sgn(D1))×D1+w2×D2+w3×D3
2、使用python-opencv进行实现
import cv2 as cv
import numpy as np
def MSDD(input):
#不同尺度的高斯滤波
finput = np.float32(input)
B1 = cv.GaussianBlur(finput, (5, 5), 1.0)
B2 = cv.GaussianBlur(finput, (5, 5), 2.0)
B3 = cv.GaussianBlur(finput, (5, 5), 4.0)
#细节分离
D1 = finput - B1
D2 = B1 - B2
D3 = B2 - B3
#加权融合
w1 = 0.5
w2 = 0.5
w3 = 0.25
dest = np.clip((1 - w1 * np.sign(D1)) * D1 + w2 * D2 + w3 * D3 + finput, 0, 255)
return np.uint8(dest)
if __name__ == '__main__':
image = cv.imread('31.png', cv.IMREAD_GRAYSCALE)
msdd_result = MSDD(image)
display = np.concatenate([image, msdd_result], axis=1)
cv.imshow('msdd', display)
cv.waitKey()
3、小结
(1)、多尺度细节提升算法原理清晰,实现简洁。
(2)、参数调试难度不大。
(3)、搞FPGA图像处理的同学,可以尝试移植下。