基于FPGA的灰度图像处理之对数变化
作者:lee神
1背景知识
对数变化的通用公式:s = clog(1+r)--------------------------------------------------------------(1)
其中c是一个常数,r为灰度级。
图1一些基本的灰度变换函数
图1中对数曲线的形状表明,该变换将输入中范围较窄的低灰度值映射为输出中较宽范围的灰度值,相反地,对高的输入灰度值也是如此。我们使用这种类型的变换来扩展图像中的暗像素的值,同时压缩更高灰度级的值。反对数变换的作用与此相反。
2 FPGA实现
图2 FPGA实现对数变换框架图
由图2可知对于灰度图像直接经过对数变换就可以得到对数变换图像,但是对于FPGA直接实现对数公式显然难度很大。在FPGA中我们采用基于查找表的方式进行对数变换。
ROM表的制作:
Matlab源码:
clearall
closeall
clc
depth = 256;
width =8;
r = [0:1:255];
y = 45*log(1+r);
x = r;
z = round(y);
fid = fopen('E:\matlab_project\log\log2.mif','w');%路径
fprintf(fid,'depth= %d; \n',depth);
fprintf(fid,'width= %d; \n',width);
fprintf(fid,'address_radix=uns;\n');
fprintf(fid,'data_radix = uns;\n');
fprintf(fid,'Content Begin \n');
for(k=1:depth)
fprintf(fid,'%d: %d; \n',k-1,z(k));
end
fprintf(fid,'end;');
holdon
plot(x);
plot(y);
holdoff
结果:
图3 log函数图
部分Rom表:
depth= 256;%数据深度
width= 8;%数据位宽
address_radix=uns;
data_radix = uns;
Content Begin
0: 0;
1: 31;
2: 49;
3: 62;
4: 72;
5: 81;
6: 88;
7: 94;
8: 99;
9: 104;
10: 108;
...
...
...
250: 249;
251: 249;
252: 249;
253: 249;
254: 249;
255: 250;
end;
FPGA源码:
//------------------------------------------
// log
//------------------------------------------
wire [7:0]log_data;
rom_log rom_log_inst(
.address(o_y_8b),
.clock(TFT_clk),
.q(log_data)
);
assign TFT_rgb = ;//Y
结果:
图4实验原图
图5实验结果
由图3可知,灰度值整体被拉大。由图4和图5观察可得图中白色区域明显增多,某些白色线条被拉长。符合log变换将输入中范围较窄的低灰度值映射为输出中较宽范围的灰度值,相反地,对高的输入灰度值也是如此。实验成功。我们猜想正常的灰度图像会被整体变亮,有兴趣的同学可以去实验。
由此我们可以得出对数变化的实际应用。比如夜间拍照图像过暗,我们可以采用对数变换;如果图像过度曝光也就是偏亮,我们可以采用反对数变换。
领取专属 10元无门槛券
私享最新 技术干货