提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
过暗和过亮的图像 经过直方图均衡化,使得图像变得清晰。
一、直方图均衡是什么?
直方图均衡化 (Histogram Equalization) 就是把一个已知灰度概率密度分布的图像经过一种变换,使之演变为一幅具有均匀灰度概率密度分布的新图像。
如下图所示:
计算步骤:
(1)计算累计直方图;
(2)将累计直方图进行区间转换;
(3)在累计直方图中,概率相近的原始值,会被处理为相同的值。
根据统计直方图,可以算出归一化直方图和累计直方图,如下图所示:
映射:
二、fpga实现
首先对输入数据统计 0-255区间灰度图像 得到统计直方图:
always@(posedge clk)
if(clc_de==1'b1)
hist_lut[clc_cnt] <= 32'd0;
else if(pre_de==1'b1)
hist_lut[pre_data] <= hist_lut[pre_data] + 1'b1;
计算累计直方图:
always@(posedge clk)
if(!rst_n)
lut_add <= 'd0;
else if(inter_de==1'b1)
lut_add <= lut_add + hist_lut[inter_cnt];
else
lut_add <= 'd0;
使用bram ip核来储存累计直方图的值:
hist_ram u1_hist_ram (
.clka (clk ),
.wea (wea ),
.addra (addra ),
.dina (lut_add ),
.douta ( ),
.clkb (clk ),
.web (1'b0 ),
.addrb (pre_data ),
.dinb (32'd0 ),
.doutb (hist_sum )
);
最后对累计直方图转换为均衡直方图:
always@(posedge clk)
if(!rst_n)
mult <= 'd0;
else if(pre_de_r==1'b1)
mult <= hist_sum*coe;
else
mult <= 'd0;
其中coe定义为:
localparam [63:0] coe = (2**25)*255/(COL*ROW);
扩大2的25次方倍是为了方便操作 节省资源 这里扩大倍数越大结果越精确
三、仿真验证
matlab统计结果:
fpga统计结果:
可以看到完全一致
处理效果:
总结
使用bram存储累计直方图 通过扩大截位操作完成均衡图