《基於單幅圖像的快速去霧》原理與C++復現(有一定工程意義)

2021-02-21 小白學視覺

重磅乾貨,第一時間送達

1. 前言

今天為大家帶來一篇之前看到的用於單幅圖像去霧的算法,作者來自清華大學,論文原文見附錄。

2. 霧天退化模型

在計算機視覺領域,通常使用霧天圖像退化模型來描述霧霾等惡劣天氣條件對圖像造成的影響,該模型是McCartney首先提出。該模型包括衰減模型和環境光模型兩部分。模型表達式為:

其中,是圖像像素的空間坐標,是觀察到的有霧圖像,是待恢復的無霧圖像,表示大氣散射係數,代表景物深度,是全局大氣光,通常情況下假設為全局常量,與空間坐標無關。

公式(1)中的表示坐標空間處的透射率,我們使用來表示透射率,於是得到公式(2):

由此可見,圖像去霧過程就是根據求解的過程。要求解出,還需要根據求解出透射率和全局大氣光實際上,所有基於霧天退化模型的去霧算法就是是根據已知的有霧圖像求解出透射率和全局大氣光

對於暗通道去霧算法來說,先從暗原色通道中選取最亮的0.1%比例的像素點,然後選取原輸入圖像中這些像素具有的最大灰度值作為全局大氣光值。RGB三通道中每一個通道都有一個大氣光值。

然後根據公式(2)可以得出:

首先可以確定的是的範圍是的範圍是的範圍是是已知的,可以根據的範圍從而確定的範圍。已知的條件有:

根據(4)和(5)推出: 

因此初略估計透射率的計算公式:

最後為了保證圖片的自然性,增加一個參數來調整透射率 :

好了,上面複習完了何凱明博士的暗通道去霧,我們一起來看看清華大學這篇論文。

3. 算法流程算法流程

實際上有了這個算法流程就可以寫出代碼了,不過為了加深理解可以看下面的一些推導。

4. 一些推導

我們知道去霧的步驟主要就是估計全局大氣光值和透射率,因此,本文就是根據輸入圖像估計(這篇論文使用了來代替),然後根據霧天退化模型求取去霧後的圖像。

4.1 估計透射率t(x)

從第二節的介紹我們知道

然後這篇論文使用了來代替,即:

我們取三個通道的最小值並記為:

所以公式2變換為

對公式(4)右邊進行均值濾波:

其中代表均值濾波的窗口大小,表示像素的鄰域。

均值濾波後的結果可以反映的大致趨勢,但與真實的還差一定的絕對值,因此,我們先得出透射率的粗略估計值:

其中,因此

為了防止去霧後圖像出現整體畫面偏暗,這裡根據圖像的均值來調整,即:

其中中所有元素的均值,是調節因子。

因此可以得到透射率的計算公式:

結合公式(1)推出:

4.2 估計全球大氣光值

公式(5)中第一個等式左側的表達式取值範圍為,由此得出

一般情況下又存在

(KaiMing He的暗通道先驗理論)。這樣就初步確定了全局大氣光的範圍,為了能快速獲取全局大氣光,文章直接取兩者的平均值作為全局大氣光值,即:

...(9)。

然後大氣光值都搞定了,那麼帶入算法流程中的最後一個公式就可以獲取最後的圖像了。

5. 代碼實現

下面是代碼實現。

#include <opencv2/opencv.hpp>#include <iostream>#include <algorithm>#include <vector>using namespace cv;using namespace std;
int getMax(Mat src) { int row = src.rows; int col = src.cols; int temp = 0; for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { temp = max((int)src.at<uchar>(i, j), temp); } if (temp == 255) return temp; } return temp;}
Mat dehaze(Mat src) { double eps; int row = src.rows; int col = src.cols; Mat M = Mat::zeros(row, col, CV_8UC1); Mat M_max = Mat::zeros(row, col, CV_8UC1); Mat M_ave = Mat::zeros(row, col, CV_8UC1); Mat L = Mat::zeros(row, col, CV_8UC1); Mat dst = Mat::zeros(row, col, CV_8UC3); double m_av, A; //get M double sum = 0; for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { uchar r, g, b, temp1, temp2; b = src.at<Vec3b>(i, j)[0]; g = src.at<Vec3b>(i, j)[1]; r = src.at<Vec3b>(i, j)[2]; temp1 = min(min(r, g), b); temp2 = max(max(r, g), b); M.at<uchar>(i, j) = temp1; M_max.at<uchar>(i, j) = temp2; sum += temp1; } } m_av = sum / (row * col * 255); eps = 0.85 / m_av; boxFilter(M, M_ave, CV_8UC1, Size(51, 51)); double delta = min(0.9, eps*m_av); for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { L.at<uchar>(i, j) = min((int)(delta * M_ave.at<uchar>(i, j)), (int)M.at<uchar>(i, j)); } } A = (getMax(M_max) + getMax(M_ave)) * 0.5; for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { int temp = L.at<uchar>(i, j); for (int k = 0; k < 3; k++) { int val = A * (src.at<Vec3b>(i, j)[k] - temp) / (A - temp); if (val > 255) val = 255; if (val < 0) val = 0; dst.at<Vec3b>(i, j)[k] = val; } } } return dst;}
int main() { Mat src = imread("F:\\fog\\1.jpg"); Mat dst = dehaze(src); cv::imshow("origin", src); cv::imshow("result", dst); cv::imwrite("F:\\fog\\res.jpg", dst); waitKey(0); return 0;}

6. 結果原圖1結果圖1原圖2結果圖2原圖3結果圖3原圖4結果圖4原圖5結果圖57. 結論

算法裡面有2個參數可以自己調節,濾波的半徑和。具體如何調節?我就不放在這裡說了,這個算法後面會在我的新專題裡面進行一遍優化,到時候再來回答這個問題。如果你迫切需要這個算法的實現或者對它感興趣,可以自己嘗試調整這兩個參數獲得想要的效果。這裡的均值濾波也可以換成我們之前講的Side Window Filter說不定可以獲得更好的效果。

8. 參考https://blog.csdn.net/u013684730/article/details/76640321https://www.cnblogs.com/Imageshop/p/3410279.html


相關焦點

  • 今日Paper|小樣本學習;機器學習;單幅圖像去霧;零樣本目標檢測等
    目錄提高小樣本學習對全新分類的識別能力 機器學習的「學習如何遺忘」複雜城市背後簡單的空間尺度規則FD-GAN:具有融合鑑別器的生成對抗網絡用於單幅圖像去霧為從城市元素之間的相互作用的角度揭示城市的演變開闢了一條新的途徑,有著廣泛的應用FD-GAN:具有融合鑑別器的生成對抗網絡用於單幅圖像去霧論文名稱:FD-GAN: Generative Adversarial Networks with Fusion-discriminator for Single Image Dehazing
  • 去霧技術」讓監控不再「霧裡看花」
    去除視頻中的霧氣,改善圖像質量是提升戶外視頻監控系統價值的一項關鍵技術。本文通過以霧圖像的物理模型為基礎建立與圖像增晰技術的關係對去霧技術進行分析,綜合近年來提出的圖像去霧方法的基本原理,說明一些典型的去霧方法是如何呈現視覺上的去霧效果的。
  • 北京航空航天大學吳洪宇等:基於單幅微距圖像的布料絲線結構建模
    真實世界的布料具有不同的微觀絲線結構,導致不同布料具有各種各樣外觀。
  • [圖像處理] 深圳供電局 謝有慶 等:基於分數階微分的電力系統有霧圖像增強研究
    基於分數階微分的電力系統有霧圖像增強研究謝有慶,何濤,邱捷(深圳供電局有限公司,廣東深圳518000)摘  要:電力系統監控視頻有霧圖像增強研究能有效縮短霧天電力系統故障發生因素查找時間和大幅提升可視化工程管控的效率,為此提出一種基於大氣散射分數階微分的自適應暗通道先驗有霧圖像增強算法。
  • 深度神經網絡教你如何圖像去霧
    一、圖像去霧的核心現有的圖像去霧(Image Dehazing)技術離不開一個簡單的自然模型——大氣散射模型(Atmospheric Scattering Model)。綜上所述,去霧的核心是如何更精確地估計媒介透射率 t(x)。
  • 偏振光學成像去霧:「擦去」照片上的霧霾
    目前,去霧技術主要分為兩大類:1)圖像處理去霧技術,通過對光學系統採集的圖像進行增強或復原操作,提高圖像的質量;2)光學去霧技術,通過對光學成像系統的改造和成像算法的優化,減小霧霾對成像質量的影響。基本原理其中,光學去霧技術通過對光學成像系統進行改造,採集多幅含有不同光學特徵的同一場景圖像,從多幅圖像中獲取目標反射光信息和大氣光信息並將其分離,進而通過算法融合出一幅復原後的去霧圖像。
  • C++程式設計師的職業生涯規劃
    對多線程環境編程有一定的理解,能獨立完成伺服器端模塊的開發、維護和優化; 4.通信、自動化、圖像處理、模式識別、視頻處理、信號與信息處理及相關專業; 2.較強的數學背景 3. 對智能視頻處理有一定了解,熟悉人臉識別、目標檢測和跟蹤、行為分析等相關技術,有相關項目實戰經驗者優先考慮; 4. 熟練掌握matlab、C/C++,有良好的編程習慣;具備視頻處理、圖像處理、模式識別,DSP開發等相關知識,且編程實現能力快。
  • 【圖像處理】基於Retinex的圖像去霧算法
    function out = darktest(filename)w0=0.65; %0.65 乘積因子用來保留一些霧,
  • 基於VFW的成像聲納視頻壓縮存儲設計
    編者按:  摘要:針對聲納系統圖像實時存儲過程中的大數據量問題,本文提了一種聲納視頻壓縮存儲的工程實現方法。採用MPEG-4視頻編碼標準[1]及Xvid編碼器,基於VFW數字視頻軟體開發包,在VS2010開發環境下實現了對聲吶視頻的高壓縮率、高壓縮質量的實時壓縮存儲。
  • 多源空譜遙感圖像質量改善問題之討論
    單幅空譜圖像超分辨單幅空譜圖像超分辨是僅對觀測的低分辨空譜圖像,而沒有其他輔助源圖像或者信息,其通過估計亞像素的信息,進行空間(幾何)解析度的增強。在實際中,該問題可能非常複雜和極具挑戰,其退化模型包括空間模糊、下採樣和噪聲汙染。不同於簡單的圖像插值與放大,單幅空譜圖像超分辨具有高度病態性,因此包含圖像復原(圖像去模糊和去噪)和圖像插值等處理要素。
  • 雲南玉楚高速朋多隧道單幅貫通
    雲南玉楚高速朋多隧道單幅貫通(王龍 攝)雲南玉楚高速朋多隧道單幅貫通(王龍 攝)12月12日上午9時16分,由中鐵建工集團玉楚高速TJ-7標承建的國家高速公路品質工程示範線——玉(溪)楚(雄)高速公路朋多隧道左幅順利貫通
  • 基於C++的電力潮流計算牛-拉法與P-Q法的分析比較
    2.1 NR法的基本原理牛頓-拉夫遜法通過逐次線性化把非線性方程式的求解過程變成對相應的線性方程式的求解過程。正是基於C++通用庫STL模板類功能便於實現模塊化,而無論採用哪種算法都須對電壓,電流及功率複數向量進行處理。此外,還要適應不同規模的算例,因此利用STL通用庫模板類進行編程成為本論文的首選。
  • MATLAB應用在基於噪聲檢測的圖像均值去噪法
    研究表明,人類獲取的視覺圖像信息在人類接受的信息中的比重達到75%,「百聞不如一見」便是非常形象的例子之一。在高度信息化條件下的今天,數字圖像越來越得到普及和應用。  然而,人們在獲取和傳輸數字圖像的同時,難免於圖像數據被外界噪聲所汙染,妨礙了人們對圖像信息的理解。由此,圖像去噪技術應運而生。圖像去噪,即在儘可能地不損失原圖像細節的前提下,去除圖像中無關的噪點。
  • 基於Matlab和Visual C++的數字濾波器設計方法
    硬體濾波又分為無源濾波和有源濾波,無源濾波是通過RC濾波器或LC濾波器等模擬濾波器進行濾波。軟體濾波也稱數字濾波,是通過一定的算法削弱噪聲的影響。硬體濾波的優勢是不需要進行複雜的程序處理,反應靈敏。而軟體濾波的優勢是不需要硬體的投入,而且可靠穩定。
  • Xilinx與Silicon開啟硬體圖像處理機器視覺應用大門
    然而,圖像處理應用領域硬體程式設計師的稀缺阻礙了FPGA技術應用。 」她說:「VisualApplets為Zynq-7000 All Programmable SoC這樣基於硬體的圖像處理應用技術打開了大門。」
  • NAS-DIP: 基於神經架構搜索的自監督圖像補全算法
    為了獲取更好的網絡架構和學習參數,來自維吉尼亞理工的研究人員們提出了一種基於神經網絡架構搜索(NAS)的方式,在更為豐富的結構空間中尋找到能夠捕捉更強圖像先驗的結構。  文末有實習生招聘,有需求的同學們不要錯過!
  • 【圖像增強03】基於Retinex理論的圖像增強
    Retinex理論的基本原理模型是以人類視覺系統為出發點發展而來的一種基於顏色恆常性的色彩理論。該理論認為:(1)人眼對物體顏色的感知與物體表面的反射性質有著密切關係,即反射率低的物體看上去較暗,反射率高的物體看上去是較亮。(2)人眼對物體色彩的感知具有一致性,不受光照變化的影響。
  • 基於百度EasyDL定製化圖像識別平臺的海洋魚類識別方法
    本文作者:範偉亞【目的】魚類識別對漁業資源的開發利用有著重要的意義。針對海底環境惡劣、拍攝環境亮度低、場景模糊的實際情況導致海底觀測視頻品質差,視頻中的魚類識別難的問題以及現有魚類識別方法存在的魚類標註數據集過少導致訓練的深度模型準確度不高的問題。【方法】本文提出了一種基於百度EasyDL定製化圖像識別平臺的海底魚類識別方法。
  • 基於中值的圖像椒鹽噪聲的非迭代濾除
    基於最大最小值的波峰波谷方法是一種非迭代的快速算法,但他對噪聲點的毀壞程度(即恢復後的圖像與原圖像相比灰度值不同點的百分數)比較高,造成了細節的不小損失。去除脈衝噪聲的高效方法對噪聲的探索比較有效,但對噪聲的濾除卻使用了簡單的標準中值方法,使得最終的實驗結果不是很好。本文綜合兩者的優點,提出了一種既能去除噪聲又能比較好的保持細節的有效方法。
  • 車牌識別技術:工作原理及流程解剖
    車牌識別技術工作原理  車輛檢測:可採用埋地線圈檢測、紅外檢測、雷達檢測技術、視頻檢測等多種方式感知車輛的經過,並觸發圖像採集抓拍。  圖像採集:通過高清攝像抓拍主機對通行車輛進行實時、不間斷記錄、採集。  預處理:噪聲過濾、自動白平衡、自動曝光以及伽馬校正、邊緣增強、對比度調整等。