HDR高动态压缩【MATLAB代码】

本文给出的是高动态范围图像压缩的程序,即HDR转换为LDR,其中程序中用到的hdr格式的高动态范围图像下载地址为http://download.csdn.net/detail/majinlei121/9380904

下面为高动态范围压缩程序:

clear all;
 
HDR = hdrread('..\HDR Images\AhwahneeGreatLounge_small.hdr');
% HDR = hdrread('..\HDR Images\AtriumMorning.hdr');
% HDR = hdrread('..\HDR Images\belgium.hdr');
% HDR = hdrread('..\HDR Images\cadik-desk02_mid.hdr');
% HDR = hdrread('..\HDR Images\designCenter.hdr');
% HDR = hdrread('..\HDR Images\desk.hdr');
% HDR = hdrread('..\HDR Images\doll.hdr');
% HDR = hdrread('..\HDR Images\groveD.hdr');
% HDR = hdrread('..\HDR Images\HancockKitchenInside_small.hdr');
% HDR = hdrread('..\HDR Images\memorial.hdr');
% HDR = hdrread('..\HDR Images\orion_correct_small.hdr');
% HDR = hdrread('..\HDR Images\paul_bunyan_small.hdr');
% HDR = hdrread('..\HDR Images\pillarsB_small.hdr');
% HDR = hdrread('..\HDR Images\snowman.hdr');
% HDR = hdrread('..\HDR Images\tinterna_small.hdr');
% HDR = hdrread('..\HDR Images\vinesunset.hdr');
% HDR = hdrread('..\HDR Images\yosemite_small.hdr');
 
L_in=(1/3)*(HDR(:,:,1)+HDR(:,:,2)+HDR(:,:,3));
L=log(L_in*1e6+1);
L=L/max(max(L));
% L=mat2gray(L);
 
alpha=0.1;
beta=1;
r=2;
nLevel = 3;
B = cell(1, nLevel);
D = cell(1, nLevel);
D_compression=cell(1, nLevel);
B{nLevel}=L;
for j = nLevel:-1:2
    B{j-1}=LocalWls_HDR(B{j}, alpha, beta, r);
    D{j}=B{j}-B{j-1};
    r=20;
end
B0=mean(mean(B{1}))*ones(size(L));
D{1}=B{1}-B0;
for j = nLevel:-1:1
    D_compression{j}=(2/pi)*atan(20*D{j});
    D_compression{j}=mat2gray(D_compression{j});
end
L_out=D_compression{1}*0.5+D_compression{2}+D_compression{3};
 
% Rmax_clip = prctile(L_out(:),99);
% Rmin_clip = prctile(L_out(:),1);
% DR_clip = Rmax_clip/Rmin_clip;
% exponent = log(100)/log(DR_clip);
% L_out = max(0,L_out/Rmax_clip) .^ exponent;
 
Rmax_clip = prctile(L_out(:),99.5);
Rmin_clip = prctile(L_out(:),0.5);
L_out(L_out>Rmax_clip)=Rmax_clip;
L_out(L_out<Rmin_clip)=Rmin_clip;
L_out=mat2gray(L_out);
%L_out=L_out/max(max(L_out));
 
out(:,:,1)=((HDR(:,:,1)./L_in).^0.6).*L_out;
out(:,:,2)=((HDR(:,:,2)./L_in).^0.6).*L_out;
out(:,:,3)=((HDR(:,:,3)./L_in).^0.6).*L_out;
 
figure;imshow(out,[]);
% imwrite(out,'result\AhwahneeGreatLounge_small.png');

最后实现的LDR图像有一些还是有光晕的,不知是程序的问题,还是论文本身的问题。


 

猜你喜欢

转载自blog.csdn.net/weixin_41923961/article/details/81430654
HDR