首页
学习
活动
专区
工具
TVP
发布

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

基于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变换将输入中范围较窄的低灰度值映射为输出中较宽范围的灰度值,相反地,对高的输入灰度值也是如此。实验成功。我们猜想正常的灰度图像会被整体变亮,有兴趣的同学可以去实验。

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

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180301G14QDV00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券