基于FPGA的直方图均衡化
1 直方图均衡
直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。
一个灰度图像,让ni表示灰度i出现的次数,这样图像中灰度为i 的像素的出现概率是
L 是图像中所有的灰度数,n 是图像中所有的像素数, p 实际上是图像的直方图,归一化到 0..1。
把 c 作为对应于 p 的累计概率函数, 定义为:
c 是图像的累计归一化直方图。
我们创建一个形式为 y = T(x) 的变化,对于原始图像中的每个值它就产生一个 y,这样 y 的累计概率函数就可以在所有值范围内进行线性化,转换公式定义为:
yi = T(xi) = c(i)
注意 T 将不同的等级映射到 0..1 域。
上面描述了灰度图像上使用直方图均衡化的方法,但是通过将这种方法分别用于图像RGB颜色值的红色、绿色和蓝色分量,从而也可以对彩色图像进行处理。
直方图均衡化简单说明:
假设一幅大小为64*64像素(MN=4096)的3 bit图像(L=8)的灰度分布如下表。其中灰度级是范围[0,L-1]=[0-7]中的整数。
及S2=4.55,S3=5.67,S4=6.23,S5=6.65,S6=6.86,S7=7.00。在这一点上,S值一直是分数,因为它们是通过求概率值的和产生的,因此我们要把他们近似为最接近的整数:
2 matlab直方图均衡
close all
clear all;
clc;
%imhist( i ):直接显示图像i的灰度直方图(默认为255个灰度级);?
%imhist(i,n):n为指定灰度级显示直方图;?
%[count, x] = imhist( i ) 获取直方图信息,count为每一级灰度像素个数,
% x为灰度级,x也可以在imhist(i,x)中指定,可以通过stem(x,count)画相应直方图;
% J=histeq(I,hgram);
% J=histeq(I,n);
% [J,T]=histeq(I);
% 注:hgram为归一化(各元素均在[0,1]上)的灰度直方图。
% [J,T]=histeq(I);返回图像J的同时也返回变换向量。
I = imread('0.bmp');
Igray = rgb2gray(I);
Ieq =histeq(Igray);
Ihist = imhist(Ieq);
figure(1),
subplot(221),imshow(Igray);
title('Igray');
subplot(222),imhist(Igray);;
subplot(223),imshow(Ieq);
title('Ieq');
subplot(224),imhist(Ieq);
3 FPGA直方图均衡
FPGA的直方图均衡化(真)
FPGA的直方图均衡化(伪)
直方图均衡模块的输入为灰度图像(未均衡化)输出为均衡化图像,采用伪均衡设计。
1,IDLE:空闲时刻,等待图像帧有效到来跳转到下一个状态。
2,STATISTICS:直方图的统计和映射,等待帧有效结束完成统计和直方图的映射(直方图均衡化)及跳转到下一个状态。
3,STATISTICS_ACC:对统计到的结果进行累加,完成后跳转到下一个状态。
4,NORMAL,EQU,WAIT_EQU:对灰度级进行归一化运算,并等待帧有效到来进行重新映射。
fpga均衡化前
fpga均衡化后
相关文章