图像显示技术的最终目的就是使得显示的图像效果尽量接近人们在自然界中观察到的对应的场景。HDR图像与视频有着更高的亮度、更深的位深、更广的色域,因此它无法在常见的普通显示器上显示。入门级的显示器与播放设备(例如普通人家使用的电视,常见的电脑、智能手机屏幕等)的对比度很低,只有大约200:1。相对性能更好的LCD显示器能达到更高的对比度,大约10000:1。但是,这些设备通常都会将一个色彩通道离散化到8-bit,少数10-bit的色度区间内。这意味着色度区间只有255个层级,这样的显示设备,我们称之为LDR显示设备。很显然,HDR图像是无法在这些显示设备上直接显示的,为了使得HDR图像与视频也能兼容地放映在LDR设备上,就必须使用色调映射(Tone Mapping)技术将HDR图像与视频映射为LDR图像与视频,进而可以正常显示在LDR显示设备上。
色调映射算法的目的在于将HDR图像的亮度进行压缩,进而映射到LDR显示设备的显示范围之内,同时,在映射的过程中要尽量保持原HDR图像的细节与颜色等重要信息。所以色调映射算法需要具有两方面的性质:1. 能够将图像亮度进行压缩。2. 能够保持图像细节与颜色。
本文提供了一种HDR压缩的方法及其Matlab实现。
局部边缘保持滤波(LEP)高动态范围图像HDR压缩
HDR中的Tone Mapping(色调映射)
一种简单的用于显示HDR的色调映射方法
JPEG-HDR
HDR关键技术:色调映射(一)
HDR关键技术:色调映射(二)
基于快速双边滤波的HDR图像对比度调整
本文只提供HDR分层代码和基本层压缩部分代码,细节层补偿部分并未提供。需要的同学可以直接通过QQ(2963033731)联系我获取。
%% HDR图像压缩技术的Matlab实现
%% 1.采用双边滤波算法对HDR图像进行分解成基本层和细节层
Img = imread('hdr1.jpg');
figure,imshow(Img,[]);title('高动态图像');
rgb = Img;
yuv = rgb2ycbcr(Img); %%RGB转换到YUV空间
y = yuv(:,:,1);%Y分量(亮度分量)
u = yuv(:,:,2);%U分量
v = yuv(:,:,3);%V分量
w = 5; %设置双边滤波的半径
sigma = [3 0.1]; %设置双边滤波的方差值
%Img = double(rgb2gray(Img)); %%提高运算精度
%主要是对HDR图像的亮度分量进行压缩
Img_base = bfilter2(double(y),w,sigma); %双边滤波函数(分层算法)
figure,imshow(Img_base,[]),title('hdr基本层图像');
%对应公式(2)和(3)
Img_detail = log10(double(y)) - Img_base; %%求取细节层图像
figure,imshow(Img_detail,[]);title('hdr细节层图像');
%% 2.针对基本层进行压缩
%采用适应性亮度对应下的视觉响应曲线作为基本层的映射函数
y = double(y);
sigma = 1.6; %sigma赋值
gausFilter = fspecial('gaussian',[3 3],sigma); %matlab 自带高斯模板滤波
Yw=imfilter(y,gausFilter,'conv');
La = 0.2*Yw;
[m,n,dims] = size(Img_base);
Img_base = double(Img_base);
L = Img_base;
for i =1:1:m
for j=1:1:n
k(i,j) = 1/(5*La(i,j)+1);
Fl(i,j) = 0.2*((k(i,j))^4)*(5*La(i,j)) + 0.1*((1-(k(i,j)^4))^2)*(5*La(i,j))^(1/3);
Lc(i,j) = ((400*(Fl(i,j)*L(i,j)/Yw(i,j))^0.7)/(27.13+(Fl(i,j)*L(i,j)/Yw(i,j))^0.7))+0.1;
end
end
%figure, imshow(Img_base_h,[]);title('基本层压缩');
figure, imshow(Lc,[]);title('基本层压缩');