Bootstrap

OpenCV实现多尺度细节提升算法

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=G1I,B2=G2I,B3=G3I
(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=IB1,D2=B1B2,D3=B2B3

(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=(1w1×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图像处理的同学,可以尝试移植下。

;