当前位置:首页 > > FPGA开源工作室

基于FPGA的灰度图像处理之对数变化

1 背景知识

对数变化的通用公式:s = clog(1+r)--------------------------------------------------------------(1)

其中c是一个常数,r为灰度级。

1 一些基本的灰度变换函数

1中对数曲线的形状表明,该变换将输入中范围较窄的低灰度值映射为输出中较宽范围的灰度值,相反地,对高的输入灰度值也是如此。我们使用这种类型的变换来扩展图像中的暗像素的值,同时压缩更高灰度级的值。反对数变换的作用与此相反。

2 FPGA实现

2 FPGA实现对数变换框架图

由图2可知对于灰度图像直接经过对数变换就可以得到对数变换图像,但是对于FPGA直接实现对数公式显然难度很大。在FPGA中我们采用基于查找表的方式进行对数变换。

ROM表的制作:

Matlab源码:

clear all

close all

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;');

hold on

plot(x);

plot(y);

hold off

结果:

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 = {log_data[7:3],log_data[7:2],log_data[7:3]}; //Y

结果:

4 实验原图

5 实验结果

由图3可知,灰度值整体被拉大。由图4和图5观察可得图中白色区域明显增多,某些白色线条被拉长。符合log变换将输入中范围较窄的低灰度值映射为输出中较宽范围的灰度值,相反地,对高的输入灰度值也是如此。实验成功。我们猜想正常的灰度图像会被整体变亮,有兴趣的同学可以去实验。

由此我们可以得出对数变化的实际应用。比如夜间拍照图像过暗,我们可以采用对数变换;如果图像过度曝光也就是偏亮,我们可以采用反对数变换。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
关闭