1. 程式人生 > >一種快速簡單而又有效的低照度影象恢復演算法

一種快速簡單而又有效的低照度影象恢復演算法

《Adaptive Local Tone Mapping Based on Retinex for High Dynamic Range Images  》的文章提出的主要內容時這對高動態影象的顯示問題,他結合傳統的Retinex技術提出了全域性自適應和區域性自適應的HDR實現過程,我也實現了整個的程式碼,但感覺前面的全域性適應方案特別對於低照度影象有著非常明顯的調節作用,因此,我重點談下整個。

直接應用原文的英文算了:

 Global adaptation takes place like an early stage of the human visual system [4]. The human visual system senses rightness as an approximate logarithmic function according o the Weber-Fechner law [5]. To globally compress the ynamic range of a HDR scene, we use the following function n (4) presented in [5].

       

  用中文解釋下上面的公式,也是本文最重要的一個公式。

  是全自適應輸出的結果,我們這裡就是需要得到他,表示輸入影象的luminance值(亮度值),表示輸入影象亮度值對的最大值,表示輸入亮度對數的平均值,如下式所示:

  

  其中N表示畫素的總數,而δ一般是個很小的值,其作用主要是為了避免對純黑色畫素進行log計算時數值溢位,這個問題在影象處理時非常常見。

  在log域進行計算,這個HDR演算法中基本是個定律了。 

  直接應用原文的話,上述算式的主要作用是:

      The input world luminance values and the maximum luminance values are divided by the log-average luminance of he scene. This enables (4) to adapt to each scene. As the log-verage luminance converges to the high value, the function c

onverges from the shape of the logarithm function to the near function. Thus, scenes of the low log-average luminance reboosted more than scenes with high values. As a result, the overall scene luminance values are adequately compressed in ccordance with the log-average luminance of the scene.

   特別注意的是 scenes of the low log-average luminance reboosted more than scenes with high values. 這句話,他的意思是說低照度的亮度部分比高照度的部分要能得到更大程度的提升,所以對於低照度圖,上述公式能起到很好的增強作用。而算式中使用了全域性的對數平均值,這就有了一定的自適應性。

  我貼一段稍微修改了的作者共享的matlab程式碼作為本演算法的參考程式碼:

function outval = ALTM_Retinex(I)
II = im2double(I);
Ir=double(II(:,:,1)); Ig=double(II(:,:,2)); Ib=double(II(:,:,3));
% Global Adaptation
Lw = 0.299 * Ir + 0.587 * Ig + 0.114 * Ib;% input world luminance values
Lwmax = max(max(Lw));% the maximum luminance value
[m, n] = size(Lw);
Lwaver = exp(sum(sum(log(0.001 + Lw))) / (m * n));% log-average luminance
Lg = log(Lw / Lwaver + 1) / log(Lwmax / Lwaver + 1);
gain = Lg ./ Lw;
gain(find(Lw == 0)) = 0;
outval = cat(3, gain .* Ir, gain .* Ig, gain .* Ib);
figure;
imshow(outval)

改寫成python程式碼為:

#simple color balance
def simple_color_balance(input_img,out_img,s1,s2):
    h,w = input_img.shape[:2]
    sort_img = input_img.copy()
    one_dim_array = sort_img.flatten()#轉化為一維陣列
    sort_array = sorted(one_dim_array)#對一維陣列按升序排序

    per1 = int((h*w)*s1/100)
    minvalue = sort_array[per1]

    per2 = int((h*w)*s2/100)
    maxvalue = sort_array[(h*w)-1-per2]

    #實施簡單白平衡演算法
    if(maxvalue<=minvalue):
        for i in range(h):
            for j in range(w):
                out_img[i,j] = maxvalue
    else:
        scale = 255.0/(maxvalue-minvalue)
        for m in range(h):
            for n in range(w):
                if(input_img[m,n] < minvalue):
                    out_img[m,n] = 0
                elif(input_img[m,n] > maxvalue):
                    out_img[m, n] = 255
                else:
                    out_img[m, n] = scale*(input_img[m,n]-minvalue)#對映中間段的影象畫素

def ALTM(img):
    h,w = img.shape[:2]
    DouImg = array(img,dtype=float32)
    Lw = zeros(img.shape[:2],dtype = float32)
    log_Lw = zeros(img.shape[:2],dtype = float32)
    Img_out = zeros(img.shape,dtype=uint8)
    B = img[:,:,0]
    G = img[:,:,1]
    R = img[:,:,2]
    Dou_B = array(B, dtype=float32)
    Dou_G = array(G, dtype=float32)
    Dou_R = array(R, dtype=float32)


    Lw = 0.299*R+0.587*G+0.114*B

    Lwmax = Lw.max()
    log_Lw = log(0.001+Lw)
    Lw_sum = log_Lw.sum()
    Lwaver = exp(Lw_sum/(h*w))
    Lg = log(Lw/Lwaver+1)/log(Lwmax/Lwaver+1)

    #simple_color_balance(Lg, Lg, 2, 3)
    gain = Lg/Lw

    Dou_B = gain * Dou_B
    Dou_G = gain * Dou_G
    Dou_R = gain * Dou_R

##對於某些影象來說可能這個效果會好些
    simple_color_balance(Dou_B,Dou_B,2,3)
    simple_color_balance(Dou_G, Dou_G, 2, 3)
    simple_color_balance(Dou_R, Dou_R, 2, 3)


    DouImg = cv2.merge([Dou_B,Dou_G,Dou_R])
    Img_out=cv2.convertScaleAbs(DouImg)

    return Img_out

執行結果:

參考文獻:

相關推薦

快速簡單有效照度影象恢復演算法

《Adaptive Local Tone Mapping Based on Retinex for High Dynamic Range Images  》的文章提出的主要內容時這對高動態影象的顯示問題,他結合傳統的Retinex技術提出了全域性自適應和區域性自適應的HD

C# 句很簡單很經典的程式碼

一.知識點   二.問題 如果以上四個問題,你很自信,那麼以下,您就不要看了,因為我想說的東西真的很簡單。 如果你開始懷疑自己,可以繼續向下看。你自己到底真的理解嗎??? 再看下面這段程式碼有沒有問題? 1 class Program 2 { 3

快速在向量空間中尋找k緊鄰的演算法——annoy index

幾個需要關注的點:1.這是一個精確度換速度的演算法,找到的k緊鄰不能保證是全域性的k緊鄰(例如在分割平面附近的點),所以如果要找exact的k緊鄰的話並不合適,還是得做全域性的搜尋2.可以通過設定tree的數量來balance精度和速度3.每次對同一份資料建立索引是不同的,所

非常簡單有效的基於格子的尋路演算法

這是之前手遊專案中琢磨出來的一個簡單易行, 同時感覺比較高效的一個尋路演算法.  當然有一個前提, 是基於格子的尋路, 你的格子可以是正方形, 六邊形等. 總之, 從一個格子移動到旁邊任何一個格子的代價是相等的, 也就是步數都是一, 這個演算法可能也適應於其它場景, 當然我

大氣簡單的Web管理(陳列)版面設計

borde absolut setup hid color 正常的 for pre == 在頁面的設計中,多版面是一種常見的設計樣式。本文命名一種 這種樣式。能夠簡單描寫敘述為一行top,一列左文件夾,剩余的右下的空間為內容展示區。這種樣式,便於高速定位

遊戲編程精粹學習 - 快速的圓柱棱臺相交測試算法

AD pos ali invisible isp using 左右 () OS 掛載Renderer的對象可以使用OnBecameVisible/OnBecameInvisible來接收剔除事件。 但是非Renderer對象則要自己處理相交檢測。 文中的方法測試結

使用貝塞爾曲線進行插值 非常簡單的平滑多邊形的方法

ear loop line coin algorithm tro itl art mov 原文 Interpolation with Bezier Curves A very simple method of smoothing polygons Init

快速卷積實現方法

本文基於論文Fast Algorithms for Convolutional Neural Networks,並且整理了相關知識點。 我們首先了解一下傅立葉變換: 對於連續型傅立葉變換的頻域核時域轉換公式: 對於離散的傅立葉變換: 關於傅立葉的理解 可以看這篇文章

VS程式設計,快速管理程式碼段的工具。

1、目的 : 方便編輯程式碼段,應用在VS中快速開發,雖然原作者的環境是VS2017,親測VS2012可成功編譯。 2、功能 第一次需要手動找程式碼段的路徑 圖示區分vs自帶程式碼段和自定義程式碼段 預設以管理員方式執行 支援新增、修改、刪除、另存為程式碼段

負載均衡(Load Balance)的簡單透徹的理解

負載均衡(Load Balance)是分散式系統架構設計中必須考慮的因素之一。 它通常是指,將請求/資料【均勻】分攤到多個操作單元上執行,負載均衡的關鍵在於【均勻】。 這裡的均勻,可不是我們想象的10 ÷ 2 = 5 ,這就算均勻啦。不是的。 常見網際網路分散式架構如上,分

FINN()簡介快速,可擴充套件的二值化神經網路框架

摘要: 研究表明,卷積神經網路具有明顯的冗餘,即使權重和啟用從浮點減少到二進位制值,也可以獲得高分類精度。在本文中,我們介紹了FINN,一個使用靈活的異構流體系結構構建快速和靈活的FPGA加速器的框架。通過利用一組新的優化功能,可以實現二值化神經網路到硬體的高效

Zen Coding: 快速編寫HTML/CSS程式碼的方法

請尊重版權,轉載請註明來源! 在本文中我們將展示一種新的使用仿CSS選擇器的語法來快速開發HTML和CSS的方法。它由Sergey Chikuyonok開發。 你在寫HTML程式碼(包括所有標籤、屬性、引用、大括號等)上花費多少時間?如果你的編輯器有程式碼提示功能,你編寫的時候就

一個簡單漂亮的404頁面原始碼

https://www.daixiaorui.com/read/114.html<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD

非常簡單非常完整的R語言主成分分析例項

本篇文章不講有關主成分分析的理論知識,只講實際操作。 例項:(中學生身體四項指標的主成分分析) 在某中學隨機抽取某年級30名學生,測量其身高(X1)、體重(X2)、胸圍(X3)和坐高(X4),資料如下。試對這30名中學生身體四項指標資料做主成分分析。

當優秀成為了習慣,堅持算得了什麼——英語總結

   引言    現在寫英語總結還是比較有感覺的,因為對於英語的學習自己還是有很多快樂和大家分享的,這個月的晨讀的 時間比較短,因為我們進入了一個新的學習環境,在這個過程中我們隊伍中的成員也在大

使用第三方框架解耦的思路—簡單工廠模式的運用

前言: 能在平時的coding中,使用到設計模式,是一件非常細節的事,但恰恰也是走向高階的開端,同樣一段程式碼,不同的人寫,水平是不一樣的。今天是由gdutxiaoxu投稿本公眾號授權釋出的,gdutxiaoxu之前寫的《記一次360面試》也是在本公眾號獨家釋出的,是老朋友了。gdutxiao

簡單的求最小平方均值函式(MSE)的方法 -- 梯度下降法。

在上一篇部落格中我們通過解析解法算出來了 但是上面公式中的對稱陣是N維乘以N維的,複雜度為O(n*n*n),雖然很精準但是很慢。 為此我們引入梯度下降法 我們首先大致畫出MSE的影象,MSE是一個開口向下,有最小值的凸函式,它的影象如下圖。

如何旋轉PDF檔案的頁面,非常簡單的方法。

  如何旋轉PDF檔案頁面呢?在使用PDF檔案的時候,有很多的頁面是歪的,想要將這些頁面旋轉就可以使用迅捷PDF編輯器,下面就為大家分享一下迅捷PDF編輯器如何進行PDF旋轉頁面的操作。  操作軟體:迅捷PDF編輯器  具體操作方法:  1:將PDF編輯器安裝到自己的電腦中,開啟軟體找到開啟更多檔案,將需要旋

如何旋轉PDF文件的頁面,非常簡單的方法。

bcf 文件添加 tor 保存 adf follow 頁面 png 編輯器 如何旋轉PDF文件頁面呢?在使用PDF文件的時候,有很多的頁面是歪的,想要將這些頁面旋轉就可以使用迅捷PDF編輯器,下面就為大家分享一下迅捷PDF編輯器如何進行PDF旋轉頁面的操作。  操作軟件:迅

快速將markdown轉換為html的方法

在一些Java Web專案中需要用markdown來寫文章並儲存到資料庫中,從資料庫中讀取出來需要轉換為html格式的程式碼段才能正確顯示文章。 將markdown 轉換為 html 有很多種方法