基于FPGA实现红外相机图像均衡化算法

书接上回,前面简单介绍了红外图像均衡化算法的操作步骤,现在就在FPGA上实现均衡化算法,不同的是由于FPGA内部存储空间有限就不能用当前统计的查找表,只能用上一张图片的统计的查找表来映射本张图像。

  1. fpga实现方法

计算方法上一回已经讲过,这里简单叙述一下fpga上的操作。假设相机是14位640*512的,首先建立一个16383个地址的RAM,图像数据到来时按像素值对RAM相应地址内的数据进行累加,例如图像当前像素值为10,则把地址为10的数据自加1,这样一张图像输出完后就统计出了每个像素值有多少个像素点了。在帧空闲时进行累加,读出前一个地址和当前地址内存储的数据进行加和结果存入当前地址,依次从地址0进行到16383,就完成了累计。最后一步当下一帧图像到来时按像素值进行替换,即取出当前像素值地址对应的累加数除以x作为该像素的像素值,这样就输出了处理后的图像。其中x为上一篇所提到的参数,具体看你想映射到多少位,如果还想映射到14位,以本文为例x就是20.

  1. 代码示例

老规矩不废话直接上码

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2022/01/12 09:51:37
// Design Name: 
// Module Name: img_enhance
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module img_enhance(
  input    I_clk,
  input I_mem_clk,
  input I_reset,
  input I_clk_test,
  input[15:0] I_video_data,
  input I_frame_valid,
  input I_line_valid,
  output reg[15:0] O_video_data,
  output reg O_line_valid,
  output reg O_frame_valid,
  output wire O_vblank,
  output wire O_hblank
    );
    
    

parameter  C_idle = 0,
           C_valid = 1,
           C_sum = 2,
           C_result = 3;
reg[16:0]  S_high,
           S_low;
           
reg[7:0] S_state;
reg[15:0] S_cnt;
reg[13:0] S_re_cnt, S_video_data_d0;
reg S_mem0_wen;
wire[13:0] S_mem0_addr;
reg[18:0] S_mem0_din;
wire[18:0] S_mem0_dout;
reg S_mem1_wen;
wire[13:0] S_mem1_addr;
reg[18:0] S_mem1_din;
wire[18:0] S_mem1_dout;
reg S_frame_valid_d0;
reg S_line_valid_d0;
reg[15:0] S_video_out;
reg[18:0] S_mem0_data;
reg[18:0] S_read_temp;
reg S_frame_valid_d1;
reg S_frame_valid_d2;
reg S_line_valid_d1;
reg S_line_valid_d2;
reg S_frame_d0;
wire S_frame_edge;
reg S_addr_sw;
reg    S_frame_valid, S_line_valid;
reg[15:0]    S_video_data;

assign O_hblank = (~O_line_valid) & O_frame_valid;
assign O_vblank = ~O_frame_valid;
assign S_frame_edge = (S_frame_d0 == 1)&(I_frame_valid == 0);
assign S_mem0_addr = (S_addr_sw == 1) ? S_re_cnt : S_video_data_d0;
assign S_mem1_addr = (S_addr_sw == 1) ? S_re_cnt : S_video_data_d0;


///
//ila_4 ila_4_i(
//   .clk(I_mem_clk),
//   .probe0(O_line_valid),
//   .probe1(O_frame_valid),
//   .probe2(S_state),
//   .probe3(O_video_data),
//   .probe4(I_frame_valid),
//   .probe5(I_line_valid),
//   .probe6(I_video_data),
//   .probe7(S_re_cnt),
//   .probe8(S_low),
//   .probe9(S_high),
//   .probe10(S_mem0_dout),
//   .probe11(S_cnt),
//   .probe12(S_mem0_din),
//   .probe13(S_mem0_addr),
//   .probe14(S_mem1_addr),
//   .p
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mayidianzi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值