ISP Matlabの高コントラストのシーン適応対数マッピング

参考文献「ハイコントラストシーンを表示するための適応対数マッピング」

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
公開された19元の記事 ウォンの賞賛1 ビュー572

おすすめ

転載: blog.csdn.net/wuyanbei24/article/details/104983482