OpenCV圖像處理專欄二十 |《Adaptive Logarithmic Mapping For Displaying High Contrast Scenes》復現

1. 前言

今天分享一篇2003年的低照度圖像增強論文《Adaptive Logarithmic Mapping For Displaying High Contrast Scenes》,論文地址為:https://domino.mpi-inf.mpg.de/intranet/ag4/ag4publ.nsf/0/53A4B81D590A3EEAC1256CFD003CE441/$file/logmap.pdf

2. 原理

首先論文第一個重要的公式是:

L_d=\frac{log(L_w+1)}{log(L_{max}+1)}

其中L_d代表每個像素的顯示亮度,L_w代表原圖像亮度,L_{max}是原圖像亮度的最大值。

第二個重要的公式是:

log_{base}x=\frac{log(x)}{log(base)}

這就是高中學過的換底公式了。

第三個重要公式是:

bias_b(t)=t^{\frac{log(b)}{log(0.5)}}

這個公式的來源為:經過實驗表明人眼對亮度的適應比較符合對數曲線,為了使得對數變換變得"平滑",使用了上述的bias變換。這個變換就是將一個數值t做一個指數變換,來達到調節的目的,當b=0.5時,即是bias_b(t)=t,當b0.73時,得到的調整函數最接近\gamma = 2.2的伽馬矯正結果,論文還嘗試0.65,0.75,0.85,0.95的不同恢復結果,最后在代碼實現部分選擇了0.85,這個值看起來是最優秀的。

第4個重要的公式為:

L_d=\frac{0.01L_{dmax}}{log_{10}(L_{wmax}+1)}*\frac{log(L_w+1)}{log(2+8(\frac{L_w}{L_{wmax}})^{\frac{log(b)}{log(0.5)}})}

其中L_{dmax}是設定的一個比例因子,根據不同的顯示器需要進行調整,CRT顯示器可以取L_{max}=100cm/m^2,這部分的細節和Bias的取值建議去看原論文,最后作者在實現過程中使用的是將原始的rgb轉成ciexyz色彩空間,然后在ciexyz空間進行變換后再轉回rgb顏色空間。

按照這幾個公式以及自己的理解去復現了一把,和論文展示的結果是比較類似的,應該不會有大問題。

3. 代碼復現

double Transform(double x)
{
    if (x <= 0.05)return x * 2.64;
    return 1.099*pow(x, 0.9 / 2.2) - 0.099;
}
struct zxy {
    double x, y, z;
}s[2500][2500];

int work(cv::Mat input_img, cv::Mat out_img) {
    int rows = input_img.rows;
    int cols = input_img.cols;
    double r, g, b;
    double lwmax = -1.0, base = 0.75;
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            b = (double)input_img.at<Vec3b>(i, j)[0] / 255.0;
            g = (double)input_img.at<Vec3b>(i, j)[1] / 255.0;
            r = (double)input_img.at<Vec3b>(i, j)[2] / 255.0;
            s[i][j].x = (0.4124*r + 0.3576*g + 0.1805*b);
            s[i][j].y = (0.2126*r + 0.7152*g + 0.0722*b);
            s[i][j].z = (0.0193*r + 0.1192*g + 0.9505*b);
            lwmax = max(lwmax, s[i][j].y);
        }
    }
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            double xx = s[i][j].x / (s[i][j].x + s[i][j].y + s[i][j].z);
            double yy = s[i][j].y / (s[i][j].x + s[i][j].y + s[i][j].z);
            double tp = s[i][j].y;
            //修改CIE:X,Y,Z
            s[i][j].y = 1.0 * log(s[i][j].y + 1) / log(2 + 8.0*pow((s[i][j].y / lwmax), log(base) / log(0.5))) / log10(lwmax + 1);
            double x = s[i][j].y / yy*xx;
            double y = s[i][j].y;
            double z = s[i][j].y / yy*(1 - xx - yy);

            //轉化為用RGB表示
            r = 3.2410*x - 1.5374*y - 0.4986*z;
            g = -0.9692*x + 1.8760*y + 0.0416*z;
            b = 0.0556*x - 0.2040*y + 1.0570*z;

            if (r < 0)r = 0; if (r>1)r = 1;
            if (g < 0)g = 0; if (g>1)g = 1;
            if (b < 0)b = 0; if (b>1)b = 1;

            //修正補償
            r = Transform(r), g = Transform(g), b = Transform(b);
            out_img.at<Vec3b>(i, j)[0] = int(b * 255);
            out_img.at<Vec3b>(i, j)[1] = int(g * 255);
            out_img.at<Vec3b>(i, j)[2] = int(r * 255);
        }
    }
    return 0;
}

4. 效果

原圖1
結果圖1
原圖2
結果圖2

對于常態的圖片,一般也能起到一定的視覺增強效果:

原圖3
結果圖3

5. 總結

從結果圖看出效果還是很不錯的,這里提供了樸素實現的代碼,其實我也有優化版,這里先賣個關子哈。請持續關注本公眾號吧,我決心會在圖像算法優化上下很大的功夫,希望和大家一起進步。


歡迎關注GiantPandaCV, 在這里你將看到獨家的深度學習分享,堅持原創,每天分享我們學習到的新鮮知識。( ? ?ω?? )?

有對文章相關的問題,或者想要加入交流群,歡迎添加BBuf微信:

二維碼
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,716評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,746評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,706評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,036評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,203評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,725評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,451評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,677評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,857評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,407評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,643評論 2 380

推薦閱讀更多精彩內容