FPGA图像处理基础 您所在的位置:网站首页 直方图均衡化图片对比 FPGA图像处理基础

FPGA图像处理基础

2024-07-12 02:03| 来源: 网络整理| 查看: 265

啥是直方图均衡化

  直方图均衡化,通过一种灰度映射使输入图像经过转换后,在每一灰度级上都有相近似的输出图像,输出的灰度值是均匀的。经过这样处理的图像具有较高的对比对和较大的动态范围。   对于离散的灰度级,直方图均衡化有如下关系: 在这里插入图片描述   其中Db是转换过后的像素的灰度值,Dmax是输入图像经过直方图统计后得到的最大的灰度值,A0是一幅图像面积,也就是所有的像素值H(i)是灰度级的各级的统计结果。Da是当前像素的灰度级。   直方图均衡化就的作用就是,对于当前的输入像素,需要首先求出小于当前像素灰度值的所有像素统计值的和,然后与该图像中的最大灰度值进行相乘,最后除以图像的面积。

基于FPGA的直方图均衡化

  基于FPGA也是能够完成图像的直方图的处理的。具体的计算步骤如下:

首先需要统计出该图像的直方图分布H(i)其次需要计算出各个灰度级下的直方图累加和也即 在这里插入图片描述找到图像的灰度最大值Dmax,然后将Dmax与对应灰度级的累加和相乘除以总的像素面积,完成图像直方图的转换

  在本人进行算法验证的时候,并没有对输入图像进行帧缓存,正常的操作应该是,将本帧的直方图统计完成后,在将缓存好的图像从内存中取出,并进行直方图均衡化。在进行算法验证时,未进行帧缓存,相当于将上一帧图像数据的统计结果作为下一帧图像的变换因子。这在变化速率不太快的情况下是可以采取的一种方式。

具体实现过程 1. 求累加和

  在上一篇博客中介绍了图像直方图的统计方法,并且最终得到的输出的直方图统计值和有效信号。因此上游模块输出直方图统计信息时,可以进行计算直方图对应灰度级下的累加和,并且确定灰度的最大值。   采用一个BRAM来存储一幅图像的灰度累加和。于此同时确定当前图形中的灰度最大值。 在这里插入图片描述

2. 进行乘法计算

  在上一步求得灰度累加和之后,当前帧图像像素已经来临,因此可以将该像素对应的灰度级和最大灰度值相乘。由于FPGA并不擅长乘法运算,尤其不擅长除法运算。因此在进行乘除法时,会调用内部的专用的DSP资源,因此可以调用Xilinx的乘法器或者除法器IP来进行乘除法的运算。 在进行乘法运算时,需要根据仿真的结果来确定乘法的Latency。

3. 进行除法计算

  在上一步的乘法计算完成后,可以进行除法的运算,在除法IP的配置时,可以设置除法的运算的潜伏期。本人所设置的Latency为7。

代码设计 /*============================================ # # Author: Wcc - [email protected] # # QQ : 1530604142 # # Last modified: 2020-07-08 20:02 # # Filename: histogram_equalization.v # # Description: # ============================================*/ `timescale 1ns / 1ps module histogram_equalization( input wire clk , input wire rst , input wire pi_hsync ,//输入的视频流信号 input wire pi_vsync , input wire pi_de , input wire pi_data_vld , input wire [7:0] pi_data , input wire pi_histo_vld ,//输入的直方图统计信息 input wire [31:0] pi_histo_data , output wire po_hsync ,//输出的视频流信号 output wire po_vsync , output wire po_de , output wire po_data_vld , output wire [7:0] po_data ); //========================================== //parameter define //========================================== parameter IMG_WIDTH = 128 ; parameter IMG_HEIGHT = 128 ; localparam TOTAL_PIXEL = IMG_WIDTH * IMG_HEIGHT; //========================================== //internal signal //========================================== reg [1:0] vsync_dd ;//场同步信号延时 reg [7:0] pi_data_dd ;//输入数据延时 reg data_vld_dd ;//输入数据有效延时 reg [2:0] stream_vld_dd ; //========================================== //求累加和与找寻灰度最大最小值 //========================================== reg [31:0] gray_sum ;//灰度累加和 reg [7:0] gray_max ;//灰度值最大值 reg [7:0] gray_min ;//灰度值最小值 reg [7:0] gray_idx ;//灰度值索引 //========================================== //确定当前像素在图像中的位置 //========================================== reg [12:0] cnt_col ; wire add_cnt_col ; wire end_cnt_col ; reg [12:0] cnt_row ; wire end_cnt_row ; wire add_cnt_row ; //========================================== //ram 相关 //========================================== reg wr_ram_en ;//存储灰度累加和的RAM wire [31:0] wr_ram_data ;//写入RAM的数据 reg [7:0] wr_ram_addr ;//写RAM时的地址 wire [7:0] rd_ram_addr ; wire [31:0] rd_ram_data ; //========================================== //multiplier //========================================== wire [39:0] mult_value ;//乘积 wire mult_vld ;//乘积有效信号 //========================================== //divider //========================================== wire div_tvalid ; wire [63 : 0] div_tdata ; //----------------vsync_dd------------------ always @(posedge clk) begin if (rst==1'b1) begin vsync_dd


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有