首页 > 其他分享 >FPGA直方图均衡化 Label: Research

FPGA直方图均衡化 Label: Research

时间:2023-10-03 13:35:59浏览次数:39  
标签:din 均衡化 cnt Research hist 直方图 valid vsync

使用FPGA对图像直方图做出均衡化,公式如下:

$$D _ { B } = f ( D _ { A } ) = \frac { D _ { m a x } } { A _ { 0 } } \sum _ { i = 0 } ^ { D _ { A } } H ( i )$$

上式中,H(i)为第i级灰度的像素个数,A为图像的面积,也即像素总数。因此,
计算均衡后的图像步骤如下:
(1)首先计算出当前图像的直方图H(i)
(2)其次计算像素直方图累计和
(3)将上式乘以灰度值的最大值
(4)将上式除以图像像素总数

后两步运算统称为归一化运算。


要把上述算法映射到FPGA中,第一步需要做的工作是什么呢?自然是帧缓存。
这是由于直方图统计需要至少一帧的数据才能完成。第一帧完成后,根据上述步骤计算出来的累加和∑,H()中的D,已经是一顿之前的像素值了。要得到这个值进行累加和查找,就必须要至少缓存一帧图像。

加速操作-近似直方图均衡化
在实际应用中,处理帧缓存是费时费力费资源的一件事情,在许多情况下,图像的变换比较慢,在这种情况下的一个近似是当建立当前帧的直方图统计结果时使用从前一帧得到的映射。结果是直方图均衡化可能不是非常准确,但是消耗的资源和处理的延时都有显著地减少。

 

/***********************************************************
********* Company: WHUT
********* Engineer:        ZhengXiaoliang
********* Design Name:      
********* Module Name:     hist_equalized.v
********* Project Name:    Image Process 
********* Description:     histogram equalized operation
********* Dependencies:    
***********************************************************/

// Engineer: radiumlrb
// Date: 2023.10.03
// Version: 1.0



`timescale 1ns/1ns

module hist_equalized(
	rst_n, 
	clk, 
	din_valid, 
	din, 
	dout, 
	vsync, 
	dout_valid, 
	vsync_out
);

parameter  DW = 8;   
parameter  IH = 512;
parameter  IW = 640;
parameter  TW = 32;

localparam TOTAL_CNT = IW * IH;
localparam HALF_WIDTH = (TW>>1);

localparam latency = 6;

input  rst_n;
input  clk;
input  din_valid;
input  [DW-1:0]din;
output [DW-1:0]dout;
input  vsync;
output vsync_out;
output dout_valid;

reg [DW-1:0]hist_cnt_addr;
wire [TW-1:0]hist_cnt_out;

histogram_2d hist(
	.rst_n(rst_n), 
	.clk(clk), 
	.din_valid(din_valid), 
	.din(din), 
	.vsync(vsync), 
	.hist_cnt_addr(hist_cnt_addr),
	.hist_cnt_out(hist_cnt_out)
);

defparam hist.DW = DW;
defparam hist.IH = IH;
defparam hist.IW = IW;

wire vsync_fall;
wire valid;
reg  [1:0]frame_cnt;
reg  hist_valid_temp;
reg  vsync_r;

reg [latency:0]valid_r;

always @(posedge clk or negedge rst_n)
if (((~(rst_n))) == 1'b1) begin
	valid_r[latency:0] <= {latency+1{1'b0}};
end
else begin
	valid_r <= #1 {valid_r[latency-1:0],valid};
end

reg [DW-1:0]din_r;


always @(posedge clk or negedge rst_n)
if (((~(rst_n))) == 1'b1) begin
	hist_cnt_addr <= {DW{1'b0}};
end
else begin
	if(valid_r[0])
		hist_cnt_addr <= #1 din_r;
end

reg [2*TW-1:0]mul_temp[0:2];
reg [DW-1:0]dout_temp;

// for 512*512
generate
if((IW ==512) & (IH ==512) )begin :IW_512

	always @(posedge clk or negedge rst_n)
	if (((~(rst_n))) == 1'b1) begin
		mul_temp[0] <= {2*TW{1'b0}};
	end
	else begin
		if(valid_r[1])
			//hist_cnt_out*255,DW must be 8 
			mul_temp[0] <= #1 {{TW-DW{1'b0}},hist_cnt_out[TW-1:0],{DW{1'b0}}} - {{TW{1'b0}},hist_cnt_out};
		if(valid_r[1])
			//hist_cnt_out/(512*512) IW = IH = 512 
			mul_temp[1] <= #1 {{18{1'b0}},mul_temp[0][2*TW-1:18]};
		if(valid_r[2])
			dout_temp <= #1 mul_temp[1][DW-1:0];
	end
end 
endgenerate

// for 640*512
generate
if(IW ==640 & IH ==512 ) begin :IW_640
	wire [2*TW-1:0]dout_tmp ;
	assign dout_tmp = {{16{1'b0}},mul_temp[2][2*TW-1:16]};
	always @(posedge clk or negedge rst_n)
	if (((~(rst_n))) == 1'b1) begin
		mul_temp[0] <= {2*TW{1'b0}};
	end
	else begin
		if(valid_r[1])
			//hist_cnt_out*51,DW must be 8 
			//hist_cnt_out*32 + hist_cnt_out*16
			mul_temp[0] <= #1 {{TW-5{1'b0}},hist_cnt_out[TW-1:0],{5{1'b0}}} + {{TW-4{1'b0}},hist_cnt_out[TW-1:0],{4{1'b0}}};
			//hist_cnt_out*2 + hist_cnt_out*1
			mul_temp[1] <= #1 {{TW{1'b0}},hist_cnt_out[TW-1:0]} + {{TW-1{1'b0}},hist_cnt_out[TW-1:0],{1{1'b0}}};
		if(valid_r[1])
			//hist_cnt_out/(64*2*512)  
			mul_temp[2] <= #1 mul_temp[0] + mul_temp[1];
			//
		if(valid_r[2])
			dout_temp <= #1 dout_tmp[DW-1:0];
	end
end 
endgenerate 


assign dout = dout_temp;
assign dout_valid  = valid_r[latency];
assign vsync_out  = vsync;

endmodule

 

标签:din,均衡化,cnt,Research,hist,直方图,valid,vsync
From: https://www.cnblogs.com/radiumlrb/p/17741037.html

相关文章

  • C#结合OpenCVSharp4使用直方图算法比较图片相似度
    C#结合OpenCVSharp4使用直方图算法比较图片相似度直方图有灰度直方图、颜色直方图,如果是灰度图像,那么就用灰度直方图,这里使用颜色直方图来计算两个图片的相似度。这里只记录如何使用,至于算法原理,问就是不会。直方图算法效率高,但精度不够,适合快速比较,例如以图搜图1.下载O......
  • Lnton羚通视频分析算法平台OpenCV-Python直方图反向投影教程
    OpenCVPython直方图反向投影用于图像分割和查找感兴趣目标。简单的说,会创建一个与输入图像同样大小的图像(单通道),每个像素对应像素属于目标的概率。更简单的说就是,输出图像在感兴趣的目标处更白。常常与camshift算法一起使用,用于目标跟踪(查找目标)如何使用呢?创建一个图像的直方......
  • VTK 实例31:灰度图像直方图
    1#include"vtkAutoInit.h"2VTK_MODULE_INIT(vtkRenderingOpenGL2);3VTK_MODULE_INIT(vtkInteractionStyle);45#include<vtkActor.h>6#include<vtkBarChartActor.h>7#include<vtkFieldData.h>8#include<v......
  • refresh、reread、research and executeQuery
    X++developersseemtobehavingalotoftroublewiththese4datasourcemethods,nomatterhowseniortheyareinAX.SoIdecidedtomakeasmallhands-ontutorial,demonstratingthecommonusagescenarioforeachofthemethods.Ihaveorderedthemet......
  • FPGA学习笔记 Label: Research
    [Synth8-9486]formalport'addr'hasnoactualordefaultvalue[D:/FPGA/TEST_CARD_HIT/top.vhd:492]有端口没有连接,在top文件中把端口加上 [Opt31-67]Problem:ALUT2cellinthedesignismissingaconnectiononinputpinI1,whichisusedbytheLUTequat......
  • opencv-python 图像直方图
    统计学中,直方图是一种对数据分布情况的图形表示,并且将统计数据组织到一系列定义好bin当中(bin是从数据中计算出的特征统计量,可以看作“直条”或“组距”)。图像直方图是用来表示数字图像中亮度分布的直方图,统计的是图像中每个像素亮度值的个数。横坐标表示图像中各个像素点的灰度级......
  • python 直方图比较
    Python直方图比较引言在数据分析和可视化领域,直方图是一种常用的图表类型,用于展示数据的分布情况。Python提供了多种库和方法来生成和比较直方图。在本文中,我将向你介绍如何使用Python实现直方图比较的方法。流程概述下表展示了实现Python直方图比较的步骤概览:步骤描述......
  • 跟着Environmental Research学作图:R语言ggplot2堆积柱形图叠加折线图(1)
    跟着EnvironmentalResearch学作图:R语言ggplot2堆积柱形图叠加折线图(1)简介在环境研究领域,数据可视化是非常重要的工具,可以帮助我们更好地理解和解释复杂的数据。本篇文章将教会你如何使用R语言中的ggplot2包创建堆积柱形图叠加折线图,以展示不同组别之间的关系和趋势。环境设......
  • 如何实现python直方图的具体操作步骤
    Python直方图直方图是数据可视化中常用的一种图形表示方式,它可以将数据按照一定的范围分成若干个区间,并统计每个区间内数据的个数。Python提供了多种库和函数来绘制直方图,使得数据分析和数据挖掘更加方便和直观。matplotlib库绘制直方图在Python中,最常用的绘图库之一就是matplot......
  • 1-14 编写一个程序,打印输入中各个字符出现频度的直方图
    ArchlinuxGCC13.1.1 202304292023-07-1123:25:36星期二 做了调整,只输出大小写字母共计56个字符的横向直方图,如有其他需要,自行添加。点击查看代码#include<stdio.h>#defineTRUE1#defineFALSE0intmain(){intc_in;intc_num[52];intc......