单尺度Retinex算法学习
生活随笔
收集整理的這篇文章主要介紹了
单尺度Retinex算法学习
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近,看了幾篇論文關于retinex算法,其中包括了單尺度SSR與多尺度SSR。今天主要學習一下單尺度SSR,介紹原理及代碼,具體實驗以后補上。
Retinex算法的基本內容:圖像由亮度圖像和反射圖像構成,分別用L(x,y)和R(x,y)表示。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? I(x,y) = L(x,y)?× R(x,y)
單尺度SSR:
? ? ? ? ? ? ? ? ? ??I(x,y) = L(x,y)?× R(x,y)
? ? ? ? ? ? ? ? ? ? L(x,y) = I(x,y) * G(x,y)? ?此處的G(x,y)是高斯卷積函數
? ? ? ?將上述公式轉換至對數域:
? ? ? ? ? ? ? ? ? ?log R = log(I / L) = log I - log L= log I - log(I * G)
實驗表明,單尺度Retinex算法可以較好地增強圖像。能在保持原始圖像亮度的同時壓縮圖像對比度,并增強圖像暗處信息。但當圖像中有大塊灰度相似的區域時,增強后的圖像會產生暈環現象。而這一現象我們可以通過雙邊濾波方法解決。
代碼來自于matlab論壇:http://www.ilovematlab.cn/thread-263388-1-1.html。
clc;clear all ; I = imread('G:\研二所有論文相關\新海霧圖\2013.8.4松花江\松花江\復件 松花江縮放\23.jpg'); figure;imshow(I,[]);title('原圖'); I=double(I); I1=I(:,:,1); I2=I(:,:,2); I3=I(:,:,3); f=double(rgb2gray(I)); %%%%%%%%%%%%%構造高斯核%%%%%%%%%%%%%%%%%%%%%%% k1=8; k2=8; r=161; % alf=1600; % alf=161; alf=20; nn=floor((r+1)/2);??% nn=81為尺度C,取80最合適 for i=1:r? ?%從1循環到81for j=1:r %? ?? ?? ?h(i,j) =exp(-((i-nn)^2+(j-nn)^2)/(k1*alf))/(k2*pi*alf*10000);? ?? ???%高斯函數h(i,j) =exp(-((i-nn)^2+(j-nn)^2)/(2*alf^2)) ;? ?? ? %高斯函數end endh = h/sum(sum(h));%歸一化%% 把高斯濾波函數轉換到頻率域fgauss=fft2(h,size(h,1),size(h,2));? ?? ?? ?? ?? ???%對高斯濾波函數進行傅里葉變換fgauss=fftshift(fgauss);? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? %將頻域中心移到零點 fgauss = ifft2( fgauss);? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? %有變換為空域 %% 利用卷積函數來實現G(x,y)與S(x,y)的卷積效果 q1=conv2(I1,fgauss,'same');??%R通道空域濾波 這里實現的就是Si(x,y)卷積Gx q2=conv2(I2,fgauss,'same'); %G通道空域濾波 q3=conv2(I3,fgauss,'same');??%B通道空域濾波 q=conv2(f,fgauss,'same');??%灰度 %% 不做對比度拉伸時候的結果 這個結果偏向于藍色分量偏大的彩色圖 得到反射分量log(R(x,y)) G1 = log(I1+1)-log(q1+1); G2= log(I2+1)-log(q2+1); G3 = log(I3+1)-log(q3+1); LLLL=log(f+1)-log(q+1); GG1=exp(G1); GG2=exp(G2); GG3=exp(G3); ssr=cat(3,G1,G2,G3); ssr1=cat(3,GG1,GG2,GG3); figure,imshow(ssr); figure,imshow(uint8(ssr)); figure,imshow(ssr1); figure,imshow(uint8(ssr1)); % figure,imshow(mat2gray(uint8(ssr1))); figure;imshow(LLLL,[]);ssr=cat(3,abs(G1),abs(G2),abs(G3));??%由于有復數因此這里加abs表示只取實數部分 figure;imshow(mat2gray(ssr));? ?? ?%顯示出了增強效果 figure;imshow(uint8(mat2gray(ssr))); %仍然顯示全黑 %% GG1=exp(G1); GG2=exp(G2); GG3=exp(G3); ssr1=cat(3,abs(GG1),abs(GG2),abs(GG3)); figure;imshow(mat2gray(ssr1));? ?%這里也顯示了增強效果 但是與前面的增強效果差不多 figure;imshow(uint8(ssr1));? ?? ?%效果很差 很一般總結
以上是生活随笔為你收集整理的单尺度Retinex算法学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [html] table中给td设置宽
- 下一篇: 前端学习(3042):vue+eleme