圖像去霧算法_圖像去霧入門指南_weixin_#算法

在計算機視覺領域,霧天等惡劣天氣會導致圖像對比度下降、細節模糊,嚴重影響後續的目標檢測、圖像分割等任務。圖像去霧算法作為解決這一問題的核心技術,已廣泛應用於自動駕駛、監控安防、遙感航拍等場景。本文將從基礎原理出發,系統梳理傳統去霧算法與深度學習去霧算法的核心思想、實現流程,並附上Python實操代碼,幫助大家快速掌握圖像去霧技術。

一、圖像去霧的核心原理:大氣散射模型

霧天圖像的退化本質是大氣散射導致的光線衰減,所有去霧算法的核心都是基於這一物理模型反向求解。

1. 大氣散射模型公式

霧天退化圖像的數學表達為:
圖像去霧算法_圖像去霧入門指南_weixin_#人工智能_02

  • 圖像去霧算法_圖像去霧入門指南_weixin_#CV_03:輸入的霧天圖像(觀測值)
  • 圖像去霧算法_圖像去霧入門指南_weixin_#圖像去霧_04:無霧原始圖像(待求解目標)
  • 圖像去霧算法_圖像去霧入門指南_weixin_#算法_05:透射率,反映光線到達相機的衰減程度(圖像去霧算法_圖像去霧入門指南_weixin_#算法_06圖像去霧算法_圖像去霧入門指南_weixin_#CV_07
  • 圖像去霧算法_圖像去霧入門指南_weixin_#人工智能_08:大氣光,霧天環境中的全局光照強度(通常為常數)

2. 去霧的核心目標

通過已知的 圖像去霧算法_圖像去霧入門指南_weixin_#CV_03,估算出 圖像去霧算法_圖像去霧入門指南_weixin_#算法_05圖像去霧算法_圖像去霧入門指南_weixin_#人工智能_08,再代入公式推導得到無霧圖像 圖像去霧算法_圖像去霧入門指南_weixin_#圖像去霧_04
圖像去霧算法_圖像去霧入門指南_weixin_#CV_13
其中 圖像去霧算法_圖像去霧入門指南_weixin_#人工智能_14


二、經典傳統去霧算法:原理與實現

傳統去霧算法的核心是通過先驗知識估算透射率 圖像去霧算法_圖像去霧入門指南_weixin_#算法_05 和大氣光 圖像去霧算法_圖像去霧入門指南_weixin_#人工智能_08,無需大量數據訓練,實時性強。

1. 暗通道先驗算法(DCP):最經典的傳統方法

1.1 核心先驗假設

自然無霧圖像中,除了天空等亮區域,絕大多數局部區域(如 15×15 窗口)至少有一個通道(R/G/B)的像素值接近 0,這一區域稱為“暗通道”。

1.2 算法步驟
  1. 計算暗通道:對霧天圖像的每個像素,在局部窗口內取 R/G/B 三通道最小值,再對整個窗口取最小值,得到暗通道圖像 圖像去霧算法_圖像去霧入門指南_weixin_#人工智能_17
  2. 估算大氣光 A:在暗通道圖像中選取亮度最高的前 0.1% 像素,對應到原始霧天圖像中取這些像素的最大值作為 圖像去霧算法_圖像去霧入門指南_weixin_#人工智能_08
  3. 估算初始透射率:基於暗通道假設推導初始透射率 圖像去霧算法_圖像去霧入門指南_weixin_#圖像處理_19圖像去霧算法_圖像去霧入門指南_weixin_#圖像處理_20
  4. 透射率優化:用軟matting或導向濾波對初始透射率進行平滑處理,避免去霧後圖像出現塊效應。
  5. 恢復無霧圖像:代入公式計算 圖像去霧算法_圖像去霧入門指南_weixin_#圖像去霧_04
1.3 Python 實現(OpenCV)
import cv2
import numpy as np

def dark_channel(img, window_size=15):
    """計算暗通道圖像"""
    min_rgb = cv2.erode(cv2.min(img, axis=2), np.ones((window_size, window_size), np.uint8))
    return min_rgb

def estimate_atmospheric_light(img, dark_img):
    """估算大氣光 A"""
    h, w = img.shape[:2]
    # 選取暗通道中前0.1%的亮像素
    num_pixels = int(h * w * 0.001)
    flat_img = img.reshape(-1, 3)
    flat_dark = dark_img.flatten()
    # 按暗通道亮度降序排序
    indices = np.argsort(-flat_dark)[:num_pixels]
    # 取這些像素在原始圖像中的最大值作為A
    A = np.max(flat_img[indices], axis=0)
    return A.astype(np.float64)

def estimate_transmission(img, A, omega=0.95, window_size=15):
    """估算初始透射率"""
    normalized_img = img.astype(np.float64) / A
    min_norm = cv2.erode(cv2.min(normalized_img, axis=2), np.ones((window_size, window_size), np.float64))
    transmission = 1 - omega * min_norm
    return transmission

def guided_filter(img, guide, radius=60, eps=1e-3):
    """導向濾波優化透射率"""
    return cv2.ximgproc.guidedFilter(guide=guide, src=img, radius=radius, eps=eps)

def dehaze(img, window_size=15, omega=0.95, t0=0.1):
    """暗通道先驗去霧主函數"""
    # 1. 計算暗通道
    dark_img = dark_channel(img, window_size)
    # 2. 估算大氣光A
    A = estimate_atmospheric_light(img, dark_img)
    # 3. 估算初始透射率
    t_init = estimate_transmission(img, A, omega, window_size)
    # 4. 導向濾波優化透射率
    t_refined = guided_filter(t_init, img[:, :, 0], radius=60, eps=1e-3)
    # 5. 限制最小透射率,避免失真
    t_refined = np.maximum(t_refined, t0)
    # 6. 恢復無霧圖像
    img_float = img.astype(np.float64)
    J = (img_float - A) / t_refined[..., np.newaxis] + A
    # 像素值裁剪到[0,255]
    J = np.clip(J, 0, 255).astype(np.uint8)
    return J

# 測試代碼
if __name__ == "__main__":
    # 讀取霧天圖像
    foggy_img = cv2.imread("foggy_image.jpg")
    # 去霧處理
    dehazed_img = dehaze(foggy_img)
    # 保存結果
    cv2.imwrite("dehazed_image.jpg", dehazed_img)
    # 顯示對比
    cv2.imshow("Foggy Image", foggy_img)
    cv2.imshow("Dehazed Image", dehazed_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

2. 其他傳統去霧算法對比

算法名稱

核心思想

優點

缺點

直方圖均衡化(HE)

拉伸圖像灰度範圍,提升對比度

實現簡單、實時性強

易過度增強噪聲,色彩失真

Retinex 算法

分離圖像的照度和反射分量,修正照度

色彩還原好

對厚霧效果差,易出現光暈

基於偏振的去霧

利用偏振光分離散射光和目標光

物理模型精確

需專用偏振相機,場景受限


三、深度學習去霧算法:端到端的解決方案

傳統算法依賴人工設計的先驗,在厚霧、不均勻霧場景下效果有限。深度學習通過數據驅動自動學習去霧規律,實現端到端去霧,性能更優。

1. 深度學習去霧的核心思路

  • 把去霧視為圖像復原任務:輸入霧天圖像 圖像去霧算法_圖像去霧入門指南_weixin_#人工智能_22,輸出無霧圖像 圖像去霧算法_圖像去霧入門指南_weixin_#人工智能_23,模型直接學習 圖像去霧算法_圖像去霧入門指南_weixin_#圖像去霧_24
  • 無需手動估算透射率和大氣光,由網絡自動學習退化模型的逆過程。

2. 經典深度學習去霧模型

2.1 DehazeNet(2016):首個CNN去霧模型
  • 核心結構:5層卷積網絡,通過“特徵提取→多尺度融合→透射率估計→圖像恢復”四步實現去霧。
  • 創新點:首次用CNN替代人工先驗估算透射率,驗證了深度學習在去霧任務中的有效性。
2.2 AOD-Net(2017):輕量級端到端模型
  • 核心結構:簡化網絡設計,僅用3層卷積,直接輸出無霧圖像。
  • 創新點:提出“所有霧都可被表示為 圖像去霧算法_圖像去霧入門指南_weixin_#算法_25”,簡化模型參數,實時性大幅提升(FPS達30+)。
2.3 基於Transformer的去霧模型(2020後)
  • 核心優勢:CNN擅長提取局部特徵,而Transformer的自注意力機制能捕捉全局霧濃度分佈,解決不均勻霧去霧難題。
  • 代表模型:DehazeFormer、Restormer(通用圖像復原模型,去霧效果頂尖)。

3. 深度學習去霧的關鍵要素

  • 數據集:常用公開數據集有 RESIDE(最大去霧數據集,含合成霧和真實霧圖像)、HazeRD。
  • 損失函數:採用 L1 損失(減少模糊)+ 感知損失(提升視覺質量)+ 對抗損失(GAN-based模型,增強細節)。
  • 訓練技巧:使用數據增強(隨機裁剪、翻轉、霧濃度變化)提升模型泛化能力。

四、算法性能評估與對比

1. 客觀評價指標

  • 峯值信噪比(PSNR):衡量去霧後圖像與真實無霧圖像的像素誤差,值越高越好(通常≥25dB為優秀)。
  • 結構相似性(SSIM):衡量圖像的結構一致性,值越接近1越好。
  • 運行速度(FPS):實時場景(如自動駕駛)需≥30FPS。

2. 不同算法性能對比

算法類型

PSNR(dB)

SSIM

FPS(CPU)

適用場景

暗通道先驗(DCP)

22-28

0.75-0.85

5-10

非實時、輕霧場景

AOD-Net

28-32

0.85-0.92

30+

實時場景、移動端部署

DehazeFormer

32-38

0.92-0.96

10-20

高精度場景、厚霧去霧


五、總結與未來展望

1. 核心總結

  • 傳統去霧算法(如DCP)依賴物理先驗,實現簡單、實時性強,但對複雜霧場景適應性差。
  • 深度學習去霧通過端到端學習,能處理厚霧、不均勻霧,視覺效果更優,但需大量數據訓練,部分模型計算量較大。
  • 實際應用中需根據場景選擇:實時場景用AOD-Net,高精度場景用DehazeFormer,資源受限場景用DCP。

2. 未來趨勢

  • 實時高精度去霧:結合輕量化網絡(如MobileNet、ShuffleNet)與Transformer,平衡速度和性能。
  • 跨場景適配:解決真實霧與合成霧的域差異,提升模型在真實場景的泛化能力。
  • 多任務融合:將去霧與目標檢測、語義分割等任務聯合訓練,滿足端到端視覺系統需求。