【精品博文】直方图均衡及其FPGA实现

毕业设计要设计一块刚挠结合板,准备设计8层,前段时间天天原理图、layout,身心疲惫啊,给自己放了10天假,回来继续原理图、layout。

之前写过直方图均衡的matlab和Verilog代码,最近做了总结,跟大家分享分享,从以下几方面来说:

1) 直方图均衡原理

2) 灰度图像均衡的Matlab代码

3) 彩色图像如何均衡

4) 直方图均衡的FPGA实现方法介绍

1. 直方图均衡(histogram equalization)原理

直方图是指图像中各个灰度级占有的像素点个数,直方图均衡化是指使用累积分布函数对图像直方图进行调整其目的是增加图像的动态范围,进而增强图像的对比度,直观上,如果一幅图像倾向于占据整个可能的灰度级并且分布均匀,则该图像具有较高对比度,使用累积分布函数对直方图进行调整的终极目标就是使图像直方图尽可能占据整个灰度级。

注意两个问题:

1) 在处理过程中,应保证处理前后,较暗的区域依旧较暗,较亮的区域依旧较亮。

2) 直方图均衡处理仅仅依靠一幅图像的直方图信息就可以完成。

2. 灰度图像均衡的Matlab代码

Matlab库中有现成的直方图均衡函数histeq,但这是针对8bit图像的,如果图像为更高精度的10bit、12bit、14bit,甚至16bit,我们就需要自己写代码了,并且如果想要移植到FPGA上实现,也需要自己写代码。下面以函数的形式给出直方图均衡的matlab代码(将下面代码保存到histogram_8bit.m文件,调用即可)。仔细理解代码,会深刻理解前面所说的直方图均衡的终极目标。

function imOut = histogram_8bit(imPri)%imPri为8bit灰度图像I = imPri;[height,width] = size(I);s = zeros(1,2^8);figure(1);subplot(2,2,1);imshow(I); %显示原图像title('原图像');subplot(2,2,2);imhist(I); %显示原图像histtitle('原图像hist');%%实现统计for i = 1:1:height    for j = 1:1:width        s(I(i,j)+1)=s(I(i,j)+1)+1;    endendp = zeros(1,2^8);%%得到累积分布p(1) = s(1);for i = 2:1:2^8p(i) = p(i-1)+s(i);end%%得到累积分布概率c = p / (height*width);c = uint8((2^8-1).*c+0.5);%%实现映射for i = 1:1:height    for j=1:1:width        I(i,j)=c(I(i,j)+1);    endendsubplot(2,2,3);imshow(I); %显示均衡后图像title('均衡后图像');subplot(2,2,4);imhist(I); %显示均衡后图像histtitle('均衡后图像hist');imOut = I;

3. 如果处理的图像为彩色图像,该怎么处理呢?我之前也是不明白,后来得到别人指点才弄清楚。先将RGB分量转化为Ycbcr,即一个强度分量Y,两个色差分量cb和cr,再对Y作均衡,cb和cr不处理,均衡完成后再将YUV分量转化为RGB分量

Matlab代码如下:

clear;close all;imIn = imread('birdNest1.JPG');% im1 = imIn(0:1500,:,:);imYcbcr = rgb2ycbcr(imIn);imYcbcr(:,:,1) = histogram_8bit(imYcbcr(:,:,1));imOut = ycbcr2rgb(imYcbcr);subplot(1,2,1);imshow(imIn);subplot(1,2,2);imshow(imOut);

从图中可以看出,动态范围得到了增强,但是色彩没那么自然。放大后效果图

4. 直方图均衡的FPGA实现方法介绍

使用FPGA进行直方图均衡,主要的问题在于数据处理的实时性,一般情况下,使用上一帧图像的信息得到累积分布关系,来映射当前帧图像,想明白了这个问题,实现起来就容易了许多。

我的设计中,使用片上sram来存储图像直方图信息。首先,根据图像大小及位宽计算所需占用的sram大小。对于1024*768,8bit图像,共有786432个像素点,灰度级为256级,需使用20bit位宽深度的sram来存储直方图信息,占用sram空间大小为256*20*2=5120*2bit=10Kb,乘以2是因为使用乒乓操作,在帧有效期间,Memory1实现统计,Memory2实现映射,在帧消隐期间,Memory1实现累计,Memory2实现清零。

图像大小及位宽

像素个数

Sram位宽

占用空间

640*480 8bit

307200

19

9.5Kb

800*600 8bit

480000

19

9.5Kb

1024*748 8bit

786432

20

10Kb

1920*1080 8bit

2073600

21

10.5Kb

从上面可以看到,对于8bit图像,直方图均衡只需占用很少的存储空间。当然如果图像为14bit位宽,灰度即为16384级,存储空间会多许多,我之前处理为320*256,14bit图像,共占用544Kb。

在实际使用时,如果像素时钟为25MHz,在均衡时,由于要读写地址、读写数据,需使用至少6倍时钟,即150MHz。我一般使用6倍时钟来均衡

5. 有个问题一直没有弄明白,如果像素时钟大于50MHz,其6倍时钟为300MHz,我测试过,以250MHz以上的时钟去读写片上ram,会出现数据不正确的情况,那么对于高像素时钟的图像数据,应该如何均衡?

(0)

相关推荐

  • phython+opencv图像处理

    做了两天的直方图均衡,还差一点点,先把前面的发布出来,后面的再慢慢来吧 . 直方图均衡主要是用于增强动态范围偏小的图像. 它的基本思想是把原始图像的直方图变换为在整个灰度范围内均匀分布的形式,这样可以 ...

  • python+opencv图像处理(十四)

    图像直方图 1.灰度图像的直方图 灰度图像的直方图是灰度级和这种灰度级的概率之间关系的图形. 直接看图,下图中左侧是原图,右图为其直方图. 完整代码如下: import cv2 as cv impor ...

  • python+opencv图像处理(十五)

    直方图均衡 直方图均衡化是通过对图像的直方图进行修正来获得图像增强效果的方法,主要是进行对比度增强,就是让亮的更亮,暗的更亮. 1.灰度图像的直方图均衡 先上图看效果. 如图上标题所示,第一张是原图, ...

  • 在 Google Colab 中使用 OpenCV 进行图像处理简介

    重磅干货,第一时间送达 在这篇文章中,我们将实现如何使用 OpenCV 在 google colaboratory 中进行图像处理.为此,我们应该了解一些 Python 基础知识,下面给出的步骤将帮助 ...

  • 【精品博文】关于FPGA处理中断

    所有的入门的屌丝都是知道处理器中断模式是两种是边沿触发和电平触发. 边沿触发用的很少,一般还是以下降沿触发为主.当设备完成一个数据后,会输出一个下降沿,触发处理器.而电平触发,是输出一个电平,并且会保 ...

  • 【精品博文】高级FPGA设计——第五章:复位电路

    复位极端重要,但是却常常容易被忽略.在这一章,我们就来聊聊复位的事. 1,同步复位和异步复位 众所周知,复位操作包括同步复位和异步复位.我们先来了解下两者存在的问题. 1.1 完全异步复位的问题 完全 ...

  • 【精品博文】高级FPGA设计——第四章:跨时钟域问题

    在FPGA设计中,不太可能只用到一个时钟.因此跨时钟域的信号处理问题是我们需要经常面对的. 跨时钟域信号如果不处理的话会导致2个问题: (1) 若高频率时钟区域输出一个脉冲信号给低频率时钟区域,则该脉 ...

  • 【精品博文】高级FPGA设计——第三章:功耗结构设计

    除了速度和面积外,数字设计中还有另外一个主要特性:功耗. 在CMOS技术中,动态功耗与门和金属引线的寄生电容充放电有关.在电容中消耗电流的一般方程为:I=V*C*f (其中I是总电流,V是电压,C是电 ...

  • 【精品博文】高级FPGA设计——第二章:面积结构设计

    在上一章中,我们提到速度是FPGA设计中的重要特性,现在要说说另一重要特性:面积. 面积过大意味着成本的提升,对FPGA以及ASIC都是如此.因此,我们需要竭力控制面积,可采用以下方法: 1,折叠流水 ...

  • 【精品博文】高级FPGA设计——第一章:高速度结构设计

    我们使用FPGA,除了实现预期功能之外,最关心的就是系统运行的速度,这是我们使用FPGA的最重要的原因. FPGA中速度包含3个指标: 流量(Throughput):每个时钟周期处理的数据量,度量为每 ...

  • 【精品博文】关于FPGA图像处理算法验证板

    淘宝网和电子论坛,卖开发板都是烂大街了.说实在的,视频处理开发板也是挺多的.但是说实在,总感觉很多fpga图像处理板子,无非简单利用摄像头做做图像插值,滤波器,二值化处理. 但真正项目有这么简单吗?图 ...

  • 【精品博文】失控----FPGA去中心化设计 <三>

    看了莫老师的回复,有必要写一篇来介绍NoC的network实现的方式,也就是第一篇中的箭头连线代表的是什么,虽然很复杂,很难讲清楚. 现在先抛开SOC EOC  NOC,这些词,可能我对这些专业词汇的 ...

  • 【精品博文】失控----FPGA去中心化设计 <二>

    资源是有限的,怎样才能做到资源利用率最大化? FPGA里面有个RAM,一般的RAM最大只有两个读取口,但是现在我希望有RAM能支持上千的读取口. 可能会问会有这种需求吗?服务器的数据库就是需要这种短时 ...

  • 【精品博文】失控----FPGA去中心化设计

    最近在看KK的<失控>,KK的观点刚好切合FPGA目前的发展------去中心化设计.这篇文章就来讲讲去中心化设计. 假设一个项目: 一.拥有的外设:4路SPI分别接外MCU,4路I2C分 ...