6 单尺度Retinex算法(文件SSR)
参考文献[3]和文献[4、7],图像增强效果如图9所示:
图9-(a) 原始图像 图9-(b) Land’s Single-scale Retinex
图9-(c) Moore’s Single-scale Retinex 图9-(d) Jobson’s Single-scale Retinex
图9-(e) Improved Moore’s Single-scale Retinex 图9-(f) Avarage Kernel for Single-scale Retinex
代码如下:
function [RetImg,FiltImg] = OriginalSingleScaleRetinex(Img,FiltSize,Method)
% Inputs:
% Img: 待处理图像
% FiltSize: 中心\周围(Center or Surround Function)
% Method: 滤波器的类型,不同类型对应不通的算法
% Outputs:
% RetImg: 光照补偿后的图像
% FiltImg: 中心\周围(Center or Surround Function)滤波的图像
% Author: HSW
% Date: 2015/4/23
% PRIS OF HARBIN INSTITUTE OF TECHNOLOGY
% Reference paper:
% D.J. Jobson, Z. Rahman, and G.A. Woodell, 揚roperties and Performance of a
% Center/Surround Retinex,?IEEE Transactions on Image Processing, vol. 6,
% no. 3, pp. 451-462, March 1997.
%
narginchk(1,3);
if ~exist('Method','var')
Method = 'Jobson';
end
if ~exist('FiltSize','var')
FiltSize = 15;
end
[nrow,ncol,dims] = size(Img);
[yy,xx] = meshgrid(-(0.5*(nrow-1)):0.5*nrow,-(0.5*size(ncol-1)):0.5*size(ncol-1));
% Built filter
if strcmp(Method,'Jobson')
kernel = exp(-(xx.^2 + yy.^2)/(2*FiltSize*FiltSize));
kernel = kernel/sum(sum(kernel));
elseif strcmp(Method,'Land')
kernel = 1./(1+(xx.^2 + yy.^2)/FiltSize);
kernel = kernel/sum(sum(kernel));
elseif strcmp(Method,'Moore')
kernel = exp(-sqrt(xx.^2 + yy.^2)/FiltSize);
kernel = kernel/sum(sum(kernel));
elseif strcmp(Method,'Avag')
kernel = 1/(nrow*ncol);
else
%built gaussian filter
kernel = exp(-(xx.^2 + yy.^2)/(2*FiltSize*FiltSize));
kernel = kernel/sum(sum(kernel));
end
DoubleImg = Normalize8(Img,0) + 0.01;
LogImg = log(DoubleImg);
% 利用FFT求卷积
fftLogImg = fft2(DoubleImg);
fftkernel = fft2(kernel,nrow,ncol);
% fftkernel = fftshift(fftshift(fftkernel,1),2);
fftkernel = fftshift(fftkernel);
FiltImg = ifft2(fftkernel.*fftLogImg);
Min = min(min(FiltImg));
FiltImg = log(FiltImg - Min + 0.01);
RetImg = LogImg - FiltImg;
RetImg = Normalize8(RetImg);
% % 直接卷积滤波
% FiltImg = ceil(imfilter(DoubleImg,kernel,'replicate','same'));
% RetImg = LogImg - log(FiltImg + (FiltImg == 0)*0.01);
% RetImg = Normalize8(RetImg);
end %function Original Single-scale Retinex
function Img = Normalize8(nImg,Method)
% Inputs:
% nImg:待归一化图像
% Method: = 1时代表归一化为[0,255], otherwise, 归一化为[0,1]
% Outputs:
%
% Author: HSW
% Date: 2015/4/23
% PRIS OF HARBIN INSTITUTE OF TECHNOLOGY
%
if ~exist('Method','var')
Method = 1;
end
nImg = double(nImg);
Img = zeros(size(nImg));
[nrow,ncol,Dims] = size(nImg);
for dims = 1:Dims
Max = max(max(nImg(:)));
Min = min(min(nImg(:)));
if Method == 1
Img(:,:,dims) = ceil(((nImg(:,:,dims) - Min*ones(nrow,ncol))./(Max*ones(nrow,ncol) - Min*ones(nrow,ncol)))*255);
else
Img(:,:,dims) = ((nImg(:,:,dims) - Min*ones(nrow,ncol))./(Max*ones(nrow,ncol) - Min*ones(nrow,ncol)));
end
end %for dims
end %function Normalize8
参考文献:
[3] 禹晶, 徐东彬, 廖庆敏. 图像去雾技术研究进展[J]. 中国图象图形学报, 2011, 16(9):1561-1576.
[4] Jobson D J, Rahman Z, Woodell G A. Properties and performance of a center/surround retinex[J]. IEEE Transactions on Image Processing, 1997, 6(3):451-462.
[7] 吴迪,朱青松. 图像去雾的最新研究进展[J]. 自动化学报,2015,02:221-239.