对数压缩的目的,是使用对数变换技术,将获得的图像信号显示在显示设备上。
以图像为例,传感器所获得的信号,其亮度动态范围非常大,数量级可达十几或更高,但是显示设备能够表达的亮度范围很小,最常见的就是0-255。
如果想要在显示设备中正确显示我们所采集的图像信号,直接显示原始数据是不行的,结果极有可能是全黑或者全白。需要使用动态范围压缩技术将信号的动态范围压缩到显示器的显示范围。
对数压缩是动态范围压缩算法的一种全局映射算法。
y=a*log(x+1)+b
log底数自选,a、b表示对数压缩系数,x表述输入数据,y表示输出数据。
系数的计算,需要确定压缩前的范围[Xmin,Xmax]以及压缩后的范围[Ymin,Ymax]。对于1中的公式,系数计算如下:
这里将0-1000的范围压缩到0-255,底数有2、e、10,从图形中可以看出,对数压缩,其底数对结果影响很小,不同的底数,在很大的压缩范围下,效果一致。
图形显示,对数压缩,将0-1000一个大范围的亮度压缩到了显示器能够显示的0-255,同时,低亮度值区域,在0-255上被拉伸,高亮度值区域,在0-255上被压缩。
对数变换,一般指图像增强技术。对数变换的目的在于增强图像低灰度区域的对比度,丰富暗区域的细节,同时,高灰度区域的对比度会被压制,细节减少。
y=c * log(v+1)(1+v * x)
其中,c表示对数变换系数,v+1表示对数的底数,x表示输入信号,y表示输出信号。
对数变换用于图像增强,其变换前后,通常数据的动态范围保持不变。
假设变换前的动态范围为[Xmin,Xmax],变换后同样为[Ymin,Ymax],一般范围为[0,1]或[0,255],变换后仍为[0,1]或[0,255]。
在图形中,将0-255变换到0-255,对数变换使得原始图像在低灰度区域被拉伸,高灰度区域被压缩。
图形中可以看出,底数越大,低灰度区域拉伸的越明显。
% 生成一些x轴上的坐标点
x = linspace(0, 255, 255);
% 计算每个x轴上的坐标点对应的y轴上的值
%对数变换
%将0-255变换到0-255
% 公式:y=c*log(v+1)(1+v*x)
ymax=255;
y1 = (ymax/(log2(1+255)))*log2(x+1);
y2 = (ymax/(log(255*(exp(1)-1)+1)))*log(x*(exp(1)-1)+1);
y3 = (ymax/(log10(255*9+1)))*log10(9*x+1);
y4=x;
% 绘制对数变换曲线
figure(1);
plot(x, y1, 'r-', x, y2, 'g--', x, y3, 'b:',x,y4,"k");
title('对数变换');
xlabel('x');
ylabel('y');
legend('log2(x)', 'log(x)', 'log10(x)','y=x');
%对数压缩
%将0-1000映射到0-ymax
% 公式:y=a*log(v)(x+1)+b v表示对数的底数
ymax=255;
x1 = linspace(0, 1000, 1000);
y11 = (ymax/log2(1001))*log2(x1+1);
% figure(3);
% plot(x1, y11);
y12 = (ymax/log(1001))*log(x1+1);
y13 = (ymax/log10(1001))*log10(x1+1);
y14 = (ymax/1000)*x1;
%绘制对数压缩曲线
figure(2);
plot(x1, y11, 'r-', x1, y12, 'g--', x1, y13, 'b:',x1,y14,"k");
title('对数压缩');
xlabel('x');
ylabel('y');
legend('log2(x)', 'log(x)', 'log10(x)','y=x');