对Retinex算法的一些理解
??? 最近在跟老師做視網膜病灶檢測的一個項目,其中一個環節是將兩張不同時刻的視網膜圖像(灰度圖像)亮度對齊以方便后續的處理,即保持相同的組織變化后的灰度值基本相同而病變區域仍有較大的差異。在這個對齊圖像亮度的環節中我主要應用了Retinex算法,也測試了一些圖像,現在把我對Retinex算法的一些理解記錄下來,方便自己日后查閱,也歡迎大家一起討論。下邊的是一些原始圖像。
為什么Retinex算法可以用于對齊圖像亮度
???? 根據Retinex理論,人眼感知物體的亮度取決于環境的照明和物體表面對照射光的反射,其數學表達式為:
? ? ? ? ? ? I(x,y)=L(x,y)*R(x,y) (乘,非卷積) (2-1)
式中:?I(x,y)代表被觀察或照相機接收到的圖像信號;L(x,y)代表環境光的照射分量 ;R(x,y)表示攜帶圖像細節信息的目標物體的反射分量 。
? ? 將(2-1)式兩邊取對數,則可拋開入射光的性質得到物體的本來面貌,即有關系式 :
? ? ? ?Log[R(x,y)] = Log[I(x,y)]-Log[L(x,y)]; ? (2-2)
??????要求得R(x,y)只需得到L(x,y)即可,但是根據數學的理論,L(x,y)是不能夠求得的,只能近似求出。我們用I(x,y)和一個高斯核的卷積來近似表示L(x,y)。所以R(x,y)可用下式表示:
?????????? R(x,y)=exp(Log(I(x,y))-Log(I(x,y)*G(x,y)))??????????????????????????????????????????????????????????????????????????????????(2-3)
???? 上式中*代表卷積,G(x,y)代表高斯核,最后我們看到的圖像是對R(x,y)映射到[0,255]上的結果,一般取線性映射。
???? 所以,籠統的講,Retinex算法是去掉光照的影響,還原圖像的本來面目。而待處理的圖像中非病灶區域可以視作沒有變化,即他們的“本來面目”是一樣的,所以我們用Retinex算法恢復出它們的“本來面目”自然相同區域也就相同,病變區域就體現出不同了。
???? 從數學上也可以證明。
???? I(x,y)和G(x,y)的卷積可以看作是高斯平滑。即L(x,y)中每一個點的值是I(x,y)中對應點高斯平滑后的值,也可以看作是以該點為中心的某個區域內的I(x,y)的加權平均,而權重由G(x,y)給出。計算R(x,y)的式2-3又可寫作I(x,)/L(x,y),即R(x,y)的值是I(x,y)的值與它周圍的點的相對關系。
???? 再看高斯核G(x,y)高斯核有兩個參數,核的大小size和高斯分布的均方差sigma,sigma影響的是對輸入圖像的加權方式,可以這樣理解,sigma越大周圍像素的權值越大。size影響的是計算某個R(x,y)的時候該點周圍區域的大小。即該點的R(x,y) 的值僅與它周圍size大小的區域有關。如果我們size取得比較小就會造成一個問題,就是在size區域內的點太單一。例如,該區域內全是值為255的點,另外一個區域內全是值為0的點,這樣經過Retinex變換的結果兩個點的值是相等的。但是在我們要處理的圖像中,視網膜圖像足夠復雜,所以我們可以把size的大小設定為30X30。而取這個值是因為對于大部分的病灶在圖上的大小不超過30X30。
???? 設我們有兩幅待處理的圖像A和B,取A中的一個點P1(x,y),同位置B中的點為P2(x,y),假設P1和P2處在相同的沒有病變的組織,P1和P2的值可能由于成像時候光照的變化造成P1和P2的值不同,但是由于P1和P2所在區域沒有實質性的病變,所以它們周圍的點的相對關系仍然比較固定。所以P1在以它為中心點的31X31的區域內的相對值應該與P2相當,這樣經過Retinex算法P1和P2的值就基本相同了。
???? 另外,我們也嘗試過其他的方法,比如將兩幅圖像都進行直方圖均衡化,以一幅圖像為標準進行直方圖規定化。但是效果不如應用Retinex算法來的好。這一點的原因我們還沒有研究過。直觀上的感覺就是Retinex保持了一些的局部特性吧,而均衡化和規定化是對全局做的。
??? 下面是上邊四幅圖像經過Single Scal Retinex算法處理之后的圖像。高斯核大小為30X30,sigma是30。對于上圖中黑的非視網膜部分直接設定R(x,y)為1。當然還是殘存了一些邊界的。
?Retinex的一些討論
???? 上述的討論是在非常理想的情況下進行的。下面我們討論一下有噪聲的情況。可以看到,對于噪聲點經過Retinex算法處理得到的仍然是噪聲點,我們不討論如何去除這些噪聲點,只討論這些噪聲點對于變換后的圖像的整體亮度的影響。
???? 假設整幅圖像只有一個噪聲點(多個類似),這個噪點的值高于周圍的點。經過Retinex算法處理后的該點的R1(x,y)(未映射到[0,255])必定高于正常情況的R(x,y)。現在考慮整幅圖像中R1(x,y) 的值。由于是線性拉伸,所以如果R1(x,y)的值未達到整幅圖像的處理后的最大值,它便不影響圖像的灰度范圍,只是一個亮的噪點。如果圖像處理后的最大值由R1(x,y)決定,則其他點的值會由[0,255]被壓縮到一個較小的范圍內,范圍的大小視R1(x,y)而定。但相對的比例關系不變。
???? 雖然一個小小的噪點就會把我們看似美好的理論打破了,但是它只是將非噪聲點的灰度值從原來的映射到[0,255]變成了另外一個值。并且重要的是我們將光照這個量基本去除了,因為光照的分布是不確定的,并且從某種意義上說,我們提取出了一些不變的局部特征。并且,如果想將處理后的圖像對齊那直方圖規定化就是一個很好的選擇了,因為直方圖規定化是從全局出發的,個別噪點影響不了大局。
??? 另外,我們還要認識到,由于光照的不確定,即便是相同區域的對應點,它們的值也不一定相同。因為有了光照的影響之后,不同圖像的對應點得到的R(x,y)會有差異,但一般來說,這個差異相不影響整幅圖像R(x,y)的最大最小值。
??? Retinex在彩色圖像上的一些局限性
??? 下面簡要介紹一下Retinex在彩色圖像上的一些局限,這也是我為什么只用Retinex處理灰度圖像的原因。
??? 一般來說,應用Retinex處理彩色圖像是分別對 R,G,B通道進行Retinex處理將得到的結果作為R,G,B通道。這種方式對于三個通道比較均衡的圖像來說效果比較好。但是有的圖像就是某一通道,如R通道分量特別小,然后經過Retinex強行將R通道調整到[0,255]區間,這樣效果想想也不會太好。
???? 為了克服這個缺點,人們開發了帶彩色恢復的多尺度Retinex算法(MSRCR,Multi-Scale Retinex with Color Restoration), 具體算法我沒有仔細研究過。http://www.cnblogs.com/Imageshop/archive/2013/04/17/3026881.html,這篇文章是一個關于Retinex算法的綜述,里面介紹了一種MSRCR算法,并實現了且附有下載。我試驗過幾幅圖像,改進不是很大,結果就不放在這里了。
???? 以上是我對Retinex算法的一些理解,歡迎批評指正。
總結
以上是生活随笔為你收集整理的对Retinex算法的一些理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [html] xml与html有什么区
- 下一篇: [vue] 在vue事件中传入$even