影象增強處理之:同態濾波與Retinex演算法(三)Retinex鄰域演算法:SSR,MSR,MSRCR
關於Retinex的基礎知識這裡就不再說了,http://blog.csdn.net/piaoxuezhong/article/details/78248219已經介紹過了,本篇將繼續講一下基於鄰域的Retinex演算法實現,主要分為三類:單尺度Retinex,多尺度Retinex和帶色彩恢復的Retinex。
單尺度Retinex:SSR
根據之前對retinex演算法的原理分析,我們可以得到:r=s-l=logS-logL,其中原始影象為S(x, y)
,反射影象為R(x, y)
,亮度影象為L(x, y),下面我直接貼下SSR的公式部分:
在 SSR 演算法中,引數 c 的選擇直接影響影象增強的效果:c 越小,SSR 的動態壓縮能力越強,影象陰暗部分的細節得到更好的增強,但是由於平均對比度範圍較小,結果會產生顏色失真;c 越大,SSR 的顏色保真度越高,但是動態壓縮能力會減弱。通常 SSR 是在動態範圍壓縮和色感一致性之間尋找平衡點。
%計算SSR
SS=zeros(m,n);
for i=1:m
for j=1:n
SS(i,j)=log(S(i,j)+0.00005); %對原始影象取對數操作
GG(i,j)=log(G(i,j)+0.00005);
V(i,j)= SS(i,j)-GG(i,j); %初步得到反射影象
end
end
函式實現我放在資源裡了,連結地址,可以實現灰度影象或彩色影象的SSR,測試函式為:
%SSR測試函式 clc,clear all,close all; Img=imread('../testImg/15.jpg'); if length(size(Img))>2 OutImg=Img; R = Img(:,:,1); G = Img(:,:,2); B = Img(:,:,3); OutImg(:,:,1) = SSR(R); OutImg(:,:,2) = SSR(G); OutImg(:,:,3) = SSR(B); else OutImg=SSR(Img); end figure,subplot(1,2,1),imshow(Img); title('original image'); subplot(1,2,2),imshow(OutImg); title('SSR image');
可以看出,單獨使用傳統SSR演算法很有可能不能取得很好的處理效果,所以有許多改進演算法出現,如參考2,3;
多尺度Retinex:MSR
SSR 演算法可能出現 halo 現象,Jobson等人又提出了多尺度Retinex演算法。通過聯合多個尺度的濾波結果,補償 halos 和照射資訊的缺失,突出暗區域的細節;MSR在SSR基礎上,同時保持影象高保真度與對影象的動態範圍進行壓縮,MSR也可實現色彩增強、顏色恆常性、區域性動態範圍壓縮、全域性動態範圍壓縮。公式為:
測試函式如下:
%% MSR clc,clear all,close all; Img=imread('../testImg/25.jpg'); if length(size(Img))>2 OutImg=Img; R = Img(:,:,1); G = Img(:,:,2); B = Img(:,:,3); OutImg(:,:,1) = MSR(R); OutImg(:,:,2) = MSR(G); OutImg(:,:,3) = MSR(B); else OutImg=MSR(Img); end figure, subplot(1,2,1),imshow(Img); title('original image'); subplot(1,2,2),imshow(OutImg); title('MSR image');
我選擇了霧天影象做了測試,引數還有優化的餘地,這裡效果感覺不是很好。
帶色彩恢復的Retinex:MSRCR
SSR或MSR演算法,可能會導致結果影象增加噪聲,使得影象的區域性細節色彩失真,不能顯現出物體的真正顏色,為此,MSRCR在MSR的基礎上,加入了色彩恢復因子,補償由於影象區域性區域對比度增強而導致顏色失真的缺陷。目前來看,MSRCR演算法受關注程度比較高,可以查到的文獻相對也多。這裡介紹兩種色彩恢復方法:
(1)IPOL的《Multiscale Retinex》一文中給出的顏色恢復方法為:
,
,
,
Ii(x, y)表示第i個通道的影象,S表示通道數,Ci表示第i個通道的彩色恢復因子; f()表示顏色空間的對映函式; β表示增益常數;α表示受控制的非線性強度;
%% MSRCR
clc,clear all,close all;
Img=imread('../testImg/25.jpg');
OutImg=MSRCR(Img);
figure,
subplot(1,2,1),imshow(Img); title('original image');
subplot(1,2,2),imshow(OutImg); title('MSRCR image');
以上都是在RGB空間域操作的,還可以轉換到HSV或者頻率域操作,這裡就不再碼了,有興趣的可以嘗試,說不定效果輸出會有意外的驚喜哦~~
這個我沒測試過,只是拷貝一下演算法步驟,參見參考7:
- 計算出 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;
參考:
- https://www.researchgate.net/publication/272643640_Multiscale_Retinex
- 《基於改進SSR的LDCT影像增強演算法》[J].計算機工程
- 《改進單尺度Retinex演算法在影象增強中的應用》[J].計算機應用與軟體
- http://download.csdn.net/download/u011004632/8071643?locationNum=2&fps=1
- 《A Multiscale Retinex for Bridging the Gap Between Color Images and the Human Observation of Scenes》
-
http://blog.csdn.net/ajianyingxiaoqinghan/article/details/71435098
-
http://blog.csdn.net/bluecol/article/details/45675615
-
http://www.cnblogs.com/Imageshop/archive/2013/04/17/3026881.html
-
http://www.cnblogs.com/Imageshop/p/3810402.html