1. 程式人生 > >retinex影象增強演算法ssr-msr-msrcr詳解及其opencv原始碼

retinex影象增強演算法ssr-msr-msrcr詳解及其opencv原始碼

原文:https://blog.csdn.net/ajianyingxiaoqinghan/article/details/71435098

Retinex影象增強演算法(SSR, MSR, MSRCR)詳解及其OpenCV原始碼

Retinex是一種常用的建立在科學實驗和科學分析基礎上的影象增強方法,它是Edwin.H.Land於1963年提出的。就跟Matlab是由Matrix和Laboratory合成的一樣,Retinex也是由兩個單詞合成的一個詞語,他們分別是retina 和cortex,即:視網膜和皮層。Land的retinex模式是建立在以下三個假設之上的:

  • 真實世界是無顏色的,我們所感知的顏色是光與物質的相互作用的結果。我們見到的水是無色的,但是水膜—肥皂膜卻是顯現五彩繽紛,那是薄膜表面光干涉的結果。
  • 每一顏色區域由給定波長的紅、綠、藍三原色構成的;
  • 三原色決定了每個單位區域的顏色。

Retinex理論的基礎理論是物體的顏色是由物體對長波(紅色)、中波(綠色)、短波(藍色)光線的反射能力來決定的,而不是由反射光強度的絕對值來決定的,物體的色彩不受光照非均勻性的影響,具有一致性,即retinex是以色感一致性(顏色恆常性)為基礎的。不同於傳統的線性、非線性的只能增強影象某一類特徵的方法,Retinex可以在動態範圍壓縮、邊緣增強和顏色恆常三個方面達到平衡,因此可以對各種不同型別的影象進行自適應的增強。

40多年來,研究人員模仿人類視覺系統發展了Retinex演算法,從單尺度Retinex演算法,改進成多尺度加權平均的MSR演算法,再發展成彩色恢復多尺度MSRCR演算法。筆者在本文中,從原理闡述演算法的流程,並提供原始碼地址。

參考連結:
http://blog.csdn.net/carson2005/article/details/9502053
http://www.cnblogs.com/Imageshop/archive/2013/04/17/3026881.html
參考論文:
《一種結合直方圖均衡化和MSRCR的影象增強新演算法》——李錦 等人

一. 單尺度SSR(Single Scale Retinex)

1. 原理

一幅給定的影象S(x,y)可以分解為兩個不同的影象:反射影象R(x,y)和入射影象(也有人稱之為亮度影象)L(x,y),其原理圖如下所示:
這裡寫圖片描述
如上圖所示,影象可以看做是入射影象和反射影象構成,入射光照射在反射物體上,通過反射物體的反射,形成反射光進入人眼。最後形成的影象可以如下公式表示:

r(x,y)=logR(x,y)=logS(x,y)L(x,y)r(x,y)=logR(x,y)=logS(x,y)L(x,y)

其中,R(x, y)表示了物體的反射性質,即影象內在屬性,我們應該最大程度的保留;而L(x, y)表示入射光影象,決定了影象畫素能達到的動態範圍,我們應該儘量去除。
一般,我們把照射影象假設估計為空間平滑影象,原始影象為S(x, y),反射影象為R(x, y),亮度影象為L(x, y),可以得出上面的公式(1),以及下面的公式:

r(x,y)=logR(x,y)=logS(x,y)L(x,y)r(x,y)=logR(x,y)=logS(x,y)L(x,y) …………(2)

r(x,y)=logS(x,y)log[F(x,y)S(x,y)]r(x,y)=log⁡S(x,y)−log⁡[F(x,y)⨂S(x,y)] ………….(3)

這裡,r(x, y)是輸出影象,式(3)中後面中括號裡的運算是卷積運算。F(x, y)是中心環繞函式,表示為:

F(x,y)=λe(x2+y2)c2F(x,y)=λe−(x2+y2)c2 ………….(4)

式(4)中的C是高斯環繞尺度,λ是一個尺度,它的取值必須滿足下式:

F(x,y)dxdy=1∫∫F(x,y)dxdy=1 ………….(5)

上面的式中可以看出,SSR演算法中的卷積是對入射影象的計算,其物理意義是通過計算畫素點與周圍區域在加權平均的作用下,估計影象中照度的變化,並將L(x,y)L(x,y)屬性。

2. 演算法的實現流程

單尺度Retinex演算法SSR的實現流程可以概括如下:

  1. 讀原圖S(x, y):
    • 若原圖為灰度圖:將影象各畫素的灰度值由整數型(int)轉換為浮點數(float),並轉換到對數域;
    • 若原圖為彩色圖:將顏色分通道處理,每個分量畫素值由整數型(int)轉換為浮點數(float),並轉換到對數域;
  2. 輸入高斯環繞尺度C,把積分運算離散化,轉為求和運算,通過上式(4)(5)確定λ的值;
  3. 由式(3)得r(x, y)
    • 若原圖是灰度圖,則只有一個r(x, y)
    • 若原圖為彩色圖,則每個通道都有一個對應的r(x, y)
  4. r(x, y)從對數域轉換到實數域,得到輸出影象R(x, y)
  5. 此時的R(x, y)值的範圍並不是0–255,所以還需要進行線性拉伸並轉換成相應的格式輸出顯示。

前面的公式中,中心環繞函式F(x, y)用的是低通函式,這樣能夠在演算法中估計出入射影象對應原始影象的低頻部分。從原始影象中除去低頻照射部分,就會留下原始影象所對應的高頻分量。高頻分量很有價值,因為在人類的視覺系統中,人眼對邊緣部分的高頻資訊相當敏感,所以SSR演算法可以較好的增強影象中的邊緣資訊。
由於SSR演算法中所選用的高斯函式特點,對於動態範圍大幅度壓縮和對比度增強兩個指標,增強後的影象不能同時保證。但是為了平衡兩種增強效果,就必須選擇一個較為恰當的高斯尺度常量C。C值一般取值在80–100之間。

3. OpenCV原始碼

見原始碼附錄的Retenix()函式。

二. 多尺度MSR(Multi-Scale Retinex)

1. 原理

MSR是在SSR基礎上發展來的,優點是可以同時保持影象高保真度與對影象的動態範圍進行壓縮的同時,MSR也可實現色彩增強、顏色恆常性、區域性動態範圍壓縮、全域性動態範圍壓縮,也可以用於X光影象增強。
MSR計算公式如下:

r(x,y)=Kkwk{logS(x,y)log[Fk(x,y)S(x,y)]}r(x,y)=∑kKwk{log⁡S(x,y)−log⁡[Fk(x,y)⋅S(x,y)]} …………(6)

式中,K是高斯中心環繞函式的個數。當K=1時,MSR退化為SSR。
通常來講,為了保證兼有SSR高、中、低三個尺度的優點來考慮,K取值通常為3,且有:

w1=w2=w3=13w1=w2=w3=13 …………(7)

此外,實驗表明,ci分別取15, 80, 200可以得到較好效果。

一般的Retinex演算法對光照影象估計時,都會假設初始光照影象是緩慢變化的,即光照影象是平滑的。但實際並非如此,亮度相差很大區域的邊緣處,影象光照變化並不平滑。所以在這種情況下,Retinuex增強演算法在亮度差異大區域的增強影象會產生光暈。
另外MSR常見的缺點還有邊緣銳化不足,陰影邊界突兀,部分顏色發生扭曲,紋理不清晰,高光區域細節沒有得到明顯改善,對高光區域敏感度小等。

2. 效果對比

對於SSR與MSR的效果如下所示:
原圖
原圖
SSR(尺度為300)增強
SSR(尺度為300)增強
MSR(尺度為300,尺度數為3)增強
MSR(尺度為300,尺度數為3)增強

原圖
原圖
SSR(尺度為300)增強
SSR(尺度為300)增強
MSR(最大尺度為300,尺度數為3)增強
MSR(最大尺度為300,尺度數為3)增強

3. OpenCV原始碼

見原始碼附錄的MultiScaleRetinex()函式。

三. 帶顏色恢復的MSR方法MSRCR(Multi-Scale Retinex with Color Restoration)

在以上的兩幅測試影象中,特別是第二幅,我們看到明顯的偏色效果,這就是SSR和MSR普遍都存在的問題。

為此,研究者又開發出一種稱之為帶色彩恢復的多尺度視網膜增強演算法(MSRCR,Multi-Scale Retinex with Color Restoration) ,具體討論的過程詳見《A Multiscale Retinex for Bridging the Gap Between Color Images and the Human Observation of Scenes》論文。

1. 原理

在前面的增強過程中,影象可能會因為增加了噪聲,而使得影象的區域性細節色彩失真,不能顯現出物體的真正顏色,整體視覺效果變差。針對這一點不足,MSRCR在MSR的基礎上,加入了色彩恢復因子C來調節由於影象區域性區域對比度增強而導致顏色失真的缺陷。
改進演算法如下所示:

RMSRCRi(x,y)=Ci(x,y)RMSRi(x,y)RMSRCRi(x,y)=Ci(x,y)RMSRi(x,y) …………(10)
其中引數說明如下:

  • Ii(x, y)表示第i個通道的影象
  • Ci表示第i個通道的彩色回覆因子,用來調節3個通道顏色的比例;
  • f(·)表示顏色空間的對映函式;
  • β是增益常數;
  • α是受控制的非線性強度;

MSRCR演算法利用彩色恢復因子C,調節原始影象中3個顏色通道之間的比例關係,從而把相對較暗區域的資訊凸顯出來,達到了消除影象色彩失真的缺陷。
處理後的影象區域性對比度提高,亮度與真實場景相似,在人們視覺感知下,影象顯得更加逼真。

但是MSRCR演算法處理影象後,畫素值一般會出現負值。所以從對數域r(x, y)轉換為實數域R(x, y)後,需要通過改變增益Gain,偏差Offset對影象進行修正。使用公式可以表示為:
RMSRCRi(x,y)=GRMSRCRi(x,y)+ORMSRCRi(x,y)′=G⋅RMSRCRi(x,y)+O …………(11)
式(11)中,G表示增益Gain,O表示偏差Offset。它們的值取決於軟體中的演算法實現。

2. MSRCR其他實現方法

MSRCR方法如上,且獲得了不錯的效果。但在博文《MSRCR》中,作者認為論文裡的方法不起任何作用,並且論文裡為了這個又引入了太多的可調引數,增加了演算法的複雜性,不利於自動化實現。
博文作者認為,GIMP的contrast-retinex.c檔案裡使用的演算法很好,效果也很好。他直接從量化的方式上入手,引入了均值和均方差的概念,再加上一個控制影象動態的引數來實現無色偏的調節過程,簡要描述如下:

  • 計算出 log[R(x,y)]中R/G/B各通道資料的均值Mean和均方差Var(注意是均方差)。
  • 類似下述公式計算各通道的Min和Max值。
    • Min = Mean - Dynamic * Var;
    • Max = Mean + Dynamic * Var;
  • 對Log[R(x,y)]的每一個值Value,進行線性對映:
    R(x,y) = ( Value - Min ) / (Max - Min) * (255 - 0), 同時要注意增加一個溢位判斷,即:
    • if (R(x, y) > 255) R(x,y) = 255;
    • else if (R(x,y) < 0) R(x,y) = 0;

就是經過這麼簡單的處理,實踐證明可以取得非常好的效果,下面貼出一些處理後的效果。

MSR(尺度為300,尺度數為3)增強
MSR(尺度為300,尺度數為3)增強
MSRCR(尺度為300,尺度數3,Dynamic = 2)增強
MSRCR(尺度為300,尺度數3,Dynamic = 2)增強
MSRCR(尺度為300,尺度數6,Dynamic = 2)增強
MSRCR(尺度為300,尺度數6,Dynamic = 2)增強

MSR(尺度300,尺度數為3)增強
MSR(尺度300,尺度數為3)增強
MSRCR(尺度300,尺度為3,Dynamic = 2)增強影象
MSRCR(尺度300, 尺度為3, Dynamic = 2)增強影象
MSRCR(尺度300,尺度為6,Dynamic = 2)增強影象
MSRCR(尺度300, 尺度為6, Dynamic = 2)增強影象

由以上三幅圖的效果得出的結論:

  • MSRCR效果要比MSR好很多,基本消除了色偏。
  • 對於MSRCR,尺度數對結果的影像不是特別大,但是隨著尺度數的增加,演算法耗時會線性增加,因此,一般尺度數取3就較為合適了。

繼續做比較:
MSRCR(Dynamic = 1)增強影象
MSRCR(Dynamic = 1)增強影象
MSRCR(Dynamic = 2)增強影象
MSRCR(Dynamic = 2)增強影象
MSRCR(Dynamic = 5)增強影象
MSRCR(Dynamic = 5)增強影象

MSRCR(Dynamic = 1)增強影象
MSRCR(Dynamic = 1)增強影象
MSRCR(Dynamic = 2)增強影象
MSRCR(Dynamic = 2)增強影象
MSRCR(Dynamic = 5)增強影象
MSRCR(Dynamic = 5)增強影象

由以上三幅圖的效果得出的結論:

  • Dynamic取值越小,影象的對比度越強。
  • 一般來說Dynamic取值2-3之間能取得較為明顯的增強效果,即能取得很自然過渡效果,又能保持影象的清晰度適度增強。

關於尺度,個人建議取值以大於100為佳。

retinex演算法的效果對於一些正常的影象處理後的效果並不佳,我們可以認為它就是為那些在外界環境不理想的狀態下拍攝的影象增強而設計的,如對於航拍的霧天圖片,醫學上的成像圖片等成像條件惡劣的圖有很明顯的效果。筆者的畢業設計涉及了水下影象的修復,水下影象相對於空氣中成像性低,應該會有很大的效果。

NASA在處理航天相關照片時也使用了Retinex技術。關於NASA對Retinex技術的應用,可以參考:http://dragon.larc.nasa.gov/retinex/

關於GIMP的實現程式碼,筆者提供從網上找到的連結。如果要想完全看懂程式碼的意思很難,但演算法部分還是不難提取的(不過筆者也懶得把它移植到OpenCV上……)下載連結如下;
http://files.cnblogs.com/Imageshop/contrast-retinex.rar

四. Retinex影象增強演算法的其他演算法

先貼出前面MSRCR的基本公式如下:

RMSRCRi(x,y)=255RMSRCRi(x,y)mini(min(x,y)RMSRCRi(x,y))maxi(max(x,y)RMSRCRi(x,y)mini(min(x,y)RMSRCR(x,y)))RMSRCRi(x,y)=255RMSRCRi(x,y)−mini(min(x,y)RMSRCRi(x,y))maxi(max(x,y)RMSRCRi(x,y)−mini(min(x,y)RMSRCR(x,y)))
…………(12)

由於Retinex資料處理後的高動態特性,所以這種方式處理後,資料分佈很廣,會出現嚴重兩極化現象,一般情況難以得到滿意的結果。

第二種方法:經典Canonical Gain/Offset演算法:
即在經典MSRCR文章《A Multiscale Retinex for Bridging the Gap Between Color Images and the Human Observation of Scenes》論文中提到的演算法。公式如下:
RMSRCRi(x,y)=G[RMSRCRi(x,y)b]RMSRCRi(x,y)=G[RMSRCRi(x,y)−b] …………(13)
式(12)中的G與b均為經驗引數。

第三種方法:自動色階方法:
該方法的處理類似於Photoshop中的自動色階,將資料按照一定百分比去除最大最小部分,然後中間部分重新線性量化到0–255之間。

第四種方法:GIMP的Retinex演算法:
詳見前文上文:三.2.MSRCR其他實現方法

五. OpenCV原始碼

筆者整理了OpenCV原始碼,在程式碼中做了中英文註釋,並已經將原始碼上傳到了我的GitHub賬戶上。筆者的OpenCV版本是2.4.9。
資料夾下載完畢後,終端進入其根目錄執行指令即可:

cmake ./
make
  
  • 1
  • 2

原始碼連結:
https://github.com/upcAutoLang/MSRCR-Restoration