参考文献「ハイコントラストシーンを表示するための適応対数マッピング」
function img_out = AdaptiveLocalToneMap(img_in)
% close all;clear all;clc;
figure,imshow(img_in),title('处理输入');
img_in = double(img_in );
%%
lwmax = -1.0;
base = 0.8;
%%
[M, N, D] = size(img_in);
img_in = img_in./255;
xyz = zeros(M, N, D);
img_out = zeros(M, N, D);
xyz(:,:, 1) = 0.4124.*img_in(:,:,1) + 0.3576.*img_in(:,:, 2) + 0.1805.*img_in(:,:, 3) ;
xyz(:,:, 2) = 0.2126.*img_in(:,:,1) + 0.7152.*img_in(:,:, 2) + 0.0722.*img_in(:,:, 3) ;
xyz(:,:, 3) = 0.0193.*img_in(:,:,1) + 0.1192.*img_in(:,:, 2) + 0.9505.*img_in(:,:, 3) ;
lwmax = max(max(xyz(:,:, 2)));
for col =1:1:M
for row = 1:1:N
xx = xyz(col,row,1)/(xyz(col,row,1)+xyz(col,row,2)+xyz(col,row,3));
yy = xyz(col,row,2)/(xyz(col,row,1)+xyz(col,row,2)+xyz(col,row,3));
tp = xyz(col,row,2);
xyz(col,row,2) = 1.0 * log(xyz(col,row,1) + 1) / log(2 + 8.0*((xyz(col,row,1) / lwmax)^(log(base) / log(0.5)))) / log10(lwmax + 1);
x = xyz(col,row,2) / yy*xx;
y = xyz(col,row,2);
z = xyz(col,row,2) / yy*(1 - xx - yy);
r = 3.2410*x - 1.5374*y - 0.4986*z;
g = -0.9692*x + 1.8760*y + 0.0416*z;
b = 0.0556*x - 0.2040*y + 1.0570*z;
r = clip(r);
g = clip(g);
b = clip(b);
r = Transform(r);
g = Transform(g);
b = Transform(b);
img_out(col ,row,1) = (r * 255);
img_out(col ,row,2) = (g * 255);
img_out(col ,row,3) = (b * 255);
end
end
figure,imshow(uint8(img_out)),title('处理结果');
end
function pixl_in = clip(pixl_in)
if pixl_in<0
pixl_in=0;
elseif pixl_in>1
pixl_in=1;
else
pixl_in=pixl_in;
end
end
function ret =Transform( x)
if (x <= 0.05)
ret = x * 2.64;
else
ret = 1.099* x^(0.9 / 2.2) - 0.099;
end
end