一种基于FPGA的CLAHE图像增强实时处理方法及系统
文献发布时间:2024-04-18 19:58:26
技术领域
本发明涉及图像处理技术领域,尤其是涉及一种基于FPGA的CLAHE图像增强实时处理方法及系统。
背景技术
CLAHE(Contrast Limited Adaptive Hitogram Equalization)限制对比度自适应直方图均衡化,是一种图像增强算法。
CLAHE算法是在全局直方图均衡化HE(Hitogram Equalization)的基础上改进而来,具有更佳的局部对比度增强效果,可显著抑制噪声、丰富图像细节。
CLAHE算法在PC上已得到广泛实现,但在FPGA可编程逻辑器件上并行处理还鲜有研究,尤其是当前帧计算出来的所有区域直方图仅对当前画面有效,实现真正意义上的视频实时处理,难度较大,因此需要进一步的研究和探索基于FPGA的CLAHE图像增强实时处理方法。
发明内容
本发明主要是解决了CLAHE算法缺乏在FPGA上的应用,无法实现视频实时处理的问题,提供了一种基于FPGA的CLAHE图像增强实时处理方法及系统。本发明将图像的行以窗口高度为大小乒乓缓存在DDR中,待逻辑完成区域化直方图统计、阈值裁剪、分布积分后,读取DDR中缓存的图像行像素,结合直方图SRAM实时获得四个映射灰度值,最后通过双线性插值的组合逻辑运算完成对每个像素点的增强处理。
本发明的上述技术问题主要是通过下述技术方案得以解决的:一种基于FPGA的CLAHE图像增强实时处理方法,包括以下步骤:
S1.采集视频流进行YUV色彩空间转换;
S2.根据设定窗口对视频流图像进行直方图区域划分;
S3.至少建立三个基于乒乓操作的顶层例化,对三个顶层例化循环输入第一图像行进行直方图CDF曲线计算,并结合输入第二图像行进行像素点邻域直方图灰度映射计算,输出像素点四个邻域直方图映射灰度;
第一图像行为基于直方图区域划分的窗口高度图像行,
第二图像行为两个顶层例化对应的第一图像行上半部和下半部结合的图像行;
S4.根据像素点所在图像坐标计算对应四个邻域直方图映射灰度权重,对四个邻域直方图映射灰度进行双线性插值计算,获得增强像素点灰度;
S5.基于增强像素点灰度的图像数据,进行RGB色彩空间转换,进行视频流输出。
本发明提出了基于FPGA的CLAHE图像实时处理方法,对视频流图像进行直方图区域划分,将图像行以窗口高度为大小乒乓缓存在外部DDR中,通过建立三个顶层例化,顶层例化采用乒乓操作进行缓存,对顶层例化循环输入第一图像行完成区域化直方图统计、阈值剪裁、分布积分,并读取外部DDR中缓存的第二图像行像素,结合直方图CDF曲线、裁剪累计值实时获得像素点邻域映射灰度,并根据三个顶层例化输出数据最终获得像素点四个邻域映射灰度,最后通过双线性插值的组合逻辑运算完成对每个像素点的增强处理。本发明实现了在FPGA上进行CLAHE图像增强处理,对图像进行实时处理,实现了真正意义上的视频实时处理。
本方案中FPGA采集到的视频流均从RGB转到YUV的色彩空间,图像的增强是对于亮度分量Y进行的处理,RGB到YUV的色彩空间采用转换公式进行转换。通过预设窗口大小,由窗口对视频流的图像进行直方图区域划分,窗口大小设置以像素点为单位,根据视频的分辨率进行划分。视频像素流以窗口高度为大小的行数乒乓存储在外部DDR中,同时以第一图像行方式输入顶层例化进行直方图统计,第一图像行为基于直方图区域划分的窗口高度图像行,输入进行直方图统计,依次对每个直方图进行统计,统计数据缓存在相应的SRAM地址空间,在统计过程中对像素点灰度进行裁剪并将超出的像素点个数在寄存器中进行累加,采用的SRAM地址空间大小可以根据每次处理的图像行大小进行相应设置。在对图像行进行直方图统计后,启动对每个直方图SRAM的积分运算即统计数据的积分运算,计算得到一排直方图CDF曲线(Cumulative Distribution Function,累计分布),对应第一图像行的所有直方图,CDF曲线以离散的方式存储在SRAM中。CDF曲线计算在顶层例化中进行,本方案至少建立三个顶层例化,其中两两顶层例化确保SRAM能够缓存两排直方图CDF数据,为后续像素点灰度映射计算能够同时获取上下邻域直方图的映射灰度,灰度映射过程需要从外部DDR中读取相应行数的图像即第二图像行,第二图像行为两个顶层例化对应的第一图像行上半部和下半部结合的图像行,保证了第二图像行像素点四个邻域直方图的完整性。三个顶层例化为乒乓操作,循环缓存逐行输入的第一图像行直方图CDF曲线数据,结合输入相应的第二图像行计算该第二图像行像素点相应的邻域直方图映射灰度,最后结合三个顶层例化的结果最终输出像素点四个邻域直方图映射灰度。然后根据像素点所在图像坐标计算权重,对四个映射灰度进行双线性插值运算得到最终增强像素点灰度。增强后的像素灰度,结合原有的UV分量,还原到RGB色彩空间,进行视频流输出。
作为一种优选方案,所述的直方图区域划分,具体包括:
根据设定窗口的大小,对图像进行直方图区域划分;
若图像横向或纵向像素点个数无法被窗口大小整除,则获取相邻的部分行数或列数,结合余数的行或列拼接成完整的直方图区域。
以像素点为单位设定窗口大小,根据视频流的分辨率对其每帧图像进行直方图区域划分。当图像分辨率宽度或高度无法被设定的窗口宽度或高度整除时,则需要重复利用图像的部分行数或列数,结合相除后的余数来拼接成完整的直方图区域。
作为一种优选方案,所述直方图CDF曲线计算包括直方图统计和直方图积分运算,
直方图统计包括,根据输入的窗口高度图像行数据,统计直方图各灰度的像素点个数,累计各灰度下超过设定裁剪阈值的像素点个数,得到裁剪累计值;
所述的获得裁剪累计值包括,设定裁剪阈值,检测各灰度像素点个数,若像素点个数超过裁剪阈值,将裁剪阈值作为该灰度像素点个数,超过裁剪阈值的像素点个数进行累加,得到裁剪累计值;
直方图积分运算包括,设定灰度累计值,遍历当前直方图灰度统计数据,将当前灰度累计值与当前灰度像素点个数相加作为新的灰度累计值,并将新的灰度累计值作为当前灰度的数值,遍历完毕获得直方图所有灰度累计值。
本方案通过设定裁剪阈值对直方图的灰度像素点数量进行裁剪,将各灰度被裁剪的像素点个数在寄存器中进行累加,最终获得该直方图所有灰度被裁剪的像素点的总和即裁剪累计值
本方案对每个直方图统计数据进行积分运算,将直方图每个灰度像素点个数依次进行累加,每次累加的累计值作为当前灰度像素点个数即得到灰度值累计值。其中灰度包括0-255,累加过程从灰度0开始,依次累加至灰度255,获得所有灰度累计值,积分运算后灰度i则表示灰度0~i所有像素点个数的总和。
作为一种优选方案,步骤S3中顶层例化计算像素点四个邻域直方图映射灰度,具体包括:
a.根据第一图像行排列逐行输入对应顶层例化,进行直方图CDF曲线计算,读取第二图像行分别输入各顶层例化;
b.各顶层例化判断像素点邻域直方图分布位置与其当前第一图像行是否对应重合匹配,若存在匹配,则计算相匹配的邻域直方图映射灰度,获取所有顶层例化的邻域直方图映射灰度,输出像素点对应四个邻域直方图映射灰度;
c.读取下一行第二图像行分别输入各顶层例化,同时对应当前最上行第一图像行的顶层例化输入下一行第一图像行;以完成直方图CDF曲线计算的乒乓操作。
d.重复步骤b和c,直至输入最末行第二图像行。
作为一种优选方案,计算像素点在邻域直方图的映射灰度,具体包括:
根据当前像素点灰度获取邻域直方图对应灰度的灰度累计值,并获取邻域直方图裁剪累计值;
灰度值累计值与256的乘积值和裁剪累计值相加,相加后的值与窗口面积值相除,相除的值为像素点在邻域直方图的映射灰度;
分别在四个邻域直方图进行灰度映射计算,获得四个邻域直方图的映射灰度。
本方案对读取图像数据中每个像素点计算其在四个邻域直方图的映射灰度,映射灰度计算公式为:
Y(i)=(sramrd(i)*256+ExceedNum)/WindowSize
其中Y(i)为灰度i在直方图均衡化映射后的灰度值即映射灰度,sramrd(i)为SRAM实体中地址为i的读取数据,即邻域直方图灰度i的灰度累计值,ExceedNum为邻域直方图裁剪累计值,WindowSize为窗口面积值。
作为一种优选方案,将直方图进行四个象限划分,根据像素点所在象限获取与该象限相邻的三个直方图,以及获取像素点所在直方图,获取的直方图为像素点四个邻域直方图。
对直方图进行四个象限划分,根据像素点所在象限位置来获取对应相邻的直方图,与像素点所在直方图共同构成四个邻域直方图。本步骤在CDF曲线计算顶层模块中进行。
作为一种优选方案,当像素点所在直方图位于图像四角位置,且像素点所在象限位于图像四角位置,则将像素点所在邻域直方图的映射灰度作为另外三个邻域直方图的映射灰度;
当像素点所在直方图位于图像边框顶部或底部位置,且像素点所在象限相邻图像边框顶部或底部位置,则将像素点所在邻域直方图的映射灰度作为与其垂直相邻的邻域直方图的映射灰度,将与像素点所在邻域直方图水平相邻的邻域直方图的映射灰度作为与其垂直相邻的邻域直方图的映射灰度;
当像素点所在直方图位于图像边框左侧或右侧位置,且像素点所在象限相邻图像边框左侧或右侧,则将像素点所在邻域直方图的映射灰度作为与其水平相邻的邻域直方图的映射灰度,将与像素点所在邻域直方图垂直相邻的邻域直方图的映射灰度作为与其水平相邻的邻域直方图的映射灰度。
当像素点位于图像四周边框位置,则不存在完整的四个邻域直方图,因此需要对部分直方图重复利用。第一种情况是像素点位于图像左上、右上、左下或右下四角位置,且当像素点所在象限同样对应位于图像左上、右上、左下或右下四角位置,则除了像素点所在邻域直方图,其他三个邻域直方图为不存在,此时重复利用像素点所在邻域直方图,将像素点所在邻域直方图的映射灰度作为另外三个邻域直方图的映射灰度。第二种情况是像素点位于图像边框顶部或底部位置,非四角位置,并且像素点所在象限同样相邻图像边框顶部或底部位置,则存在像素点所在邻域直方图和与其水平相邻的邻域直方图,另外两个邻域直方图不存在,此时重复利用当前存在的两个邻域直方图,如记像素点所在邻域直方图为a,与其水平相邻的邻域直方图为b,则将邻域直方图a的映射灰度作为与邻域直方图a垂直相邻的邻域直方图的映射灰度,同样将邻域直方图b的映射灰度作为与邻域直方图b垂直相邻的邻域直方图的映射灰度。第三种情况是像素点位于图像边框左侧或右侧位置,非四角位置,并且像素点所在象限同样相邻图像边框左侧或右侧位置,则存在像素点所在邻域直方图和与其垂直相邻的邻域直方图,另外两个邻域直方图不存在,此时重复利用当前存在的两个邻域直方图,如记像素点所在邻域直方图为c,与其垂直相邻的邻域直方图为d,则将邻域直方图c的映射灰度作为与邻域直方图c水平相邻的邻域直方图的映射灰度,同样将邻域直方图d的映射灰度作为与邻域直方图d水平相邻的邻域直方图的映射灰度。
作为一种优选方案,所述S4具体包括:
基于像素点坐标计算四个邻域直方图映射灰度权重,根据权重计算双线性插值的中间值,计算如下:
BI
BI
BI
BI
其中BI
根据双线性插值中间量计算增强像素点灰度,计算如下
Y’=(BI
对于待增强的像素点,根据像素点的灰度获得四个邻域直方图,进而获得四个不同的映射灰度,结合像素点的坐标来计算四个映射灰度的权重,其中像素点坐标的∆x和∆y决定四个映射灰度的权重,最后经FPGA组合逻辑乘法器运算后获得双线性插值结果,为像素点最终增强结果,即增强像素点灰度。
一种基于FPGA的CLAHE图像增强实时处理系统,包括,
YUV色空间转换模块,对视频流进行YUV色彩空间转换;
直方图划分模块,根据设定窗口对图像进行直方图区域划分;
外部存储模块,以窗口高度大小行数对视频像素流进行存储;
CDF曲线计算顶层模块,至少包括三个采用乒乓操作的CDF曲线计算顶层模块,对三个顶层模块循环输入第一图像行进行直方图CDF曲线计算,并结合输入第二图像行进行像素点邻域直方图灰度映射计算,输出像素点四个邻域直方图映射灰度;
双线性插值模块,根据像素点所在图像坐标计算对应四个邻域直方图映射灰度权重,对四个邻域直方图映射灰度进行双线性插值计算;
RGB色空间转换模块,对视频流进行YUV色彩空间转换。
作为一种优选方案,所述CDF曲线计算顶层模块包括直方图统计单元、积分单元、灰度映射单元,其中,
直方图统计单元,根据输入的窗口高度图像行数据,统计直方图各灰度的像素点个数,累计灰度下超过设定裁剪阈值的像素点个数的裁剪累计值;
积分单元,对每个直方图各灰度的像素点个数依次累加,得到直方图CDF曲线;
灰度映射单元,读取外部存储模块图像,结合直方图CDF曲线、裁剪累计值计算第二图像行每个像素点对应四个邻域直方图的映射灰度。
因此,本发明的优点是:对视频流图像进行直方图区域划分,将图像行以窗口高度为大小乒乓缓存在外部DDR中,通过建立三个顶层例化,顶层例化采用乒乓操作进行缓存,对顶层例化循环输入第一图像行完成区域化直方图统计、阈值剪裁、分布积分,并读取外部DDR中缓存的第二图像行像素,结合直方图CDF曲线、裁剪累计值实时获得像素点邻域映射灰度,并根据三个顶层例化输出数据最终获得像素点四个邻域映射灰度,最后通过双线性插值的组合逻辑运算完成对每个像素点的增强处理。本发明实现了在FPGA上进行CLAHE图像增强处理,对图像进行实时处理,实现了真正意义上的视频实时处理。
附图说明
图1是本发明方法的一种流程示意图;
图2是本发明系统的一种架构示意图;
图3是本发明中CDF曲线计算顶层模块的一种架构示意图;
图4是本发明中直方图统计单元的一种架构示意图;
图5是本发明中直方图区域划分的一种例子示意图;
图6是本发明中SRAM实体的一种结构示意图;
图7是本发明中第一图像行对应的一排直方图CDF曲线示意图;
图8是本发明中CDF曲线计算顶层模块的例化示意图;
图9是本发明中外部存储模块图像读取方式的示意图;
图10是本发明中映射灰度赋值计算的第一种例子示意图;
图11是本发明中映射灰度赋值计算的第二种例子示意图;
图12是本发明中映射灰度赋值计算的第三种例子示意图;
图13是本发明中双线性插值计算的一种拓扑结构示意图。
1-YUV色彩空间转换模块 2-直方图划分模块 3-CDF曲线计算顶层模块 4-双线性插值模块 5-RGB色彩空间转换模块 6-外部存储模块 7-缓存控制模块 8-读取控制模块31-直方图统计单元 32-积分单元 33-灰度映射单元 311-SRAM实体 312-SRAM读控制单元313-裁剪单元 314-SRAM写控制单元。
具体实施方式
下面通过实施例,并结合附图,对本发明的技术方案作进一步具体的说明。
实施例:
本实施例一种基于FPGA的CLAHE图像增强实时处理系统,如图2所示,包括YUV色空间转换模块1、直方图划分模块2、外部存储模块6、CDF曲线计算顶层模块3、双线性插值模块4、RGB色空间转换模块5,YUV色空间转换模块连接直方图划分模块,直方图划分模块连接CDF曲线计算顶层模块,且直方图划分模块通过缓存控制模块连接外部存储模块,外部存储模块通过读取控制单元连接至CDF曲线计算顶层模块,CDF曲线计算顶层模块输出连接双线性插值模块连接,双线性插值模块连接RGB色空间转换模块。
RGB色空间转换模块,用于对视频流进行YUV色彩空间转换。
直方图划分模块,根据设定窗口对图像进行直方图区域划分。窗口大小设置以像素点为单位,根据视频的分辨率进行划分。
外部存储模块,通过缓存控制模块将视频像素流以窗口高度大小行数乒乓存储在外部存储模块中,另外CDF曲线计算顶层模块通过读取控制单元读取相应第二图像行。
CDF曲线计算顶层模块包括直方图统计单元31、积分单元32、灰度映射单元33,如图3所示,直方图统计单元输入连接直方图划分模块,直方图统计单元分别连接积分单元和灰度映射单元。
直方图统计单元,根据输入的窗口高度图像行数据,统计直方图各灰度的像素点个数,累计灰度下超过设定裁剪阈值的像素点个数的裁剪累计值;直方图划分模块输出图像至外部存储模块进行存储外,还以第一图像行形式输出至直方图统计单元,第一图像行为基于直方图区域划分的窗口高度图像行。
直方图统计单元包括两个SRAM实体311、裁剪单元313、SRAM读控制单元312、SRAM写控制单元314,如图4所示,SRAM读控制单元分别连接两个SRAM实体,并且SRAM读控制单元输出连接裁剪单元,裁剪单元输出连接SRAM写控制单元,SRAM写控制单元分别与两个SRAM实体连接。
在直方图统计单元里统计数据间隔分配在两个SRAM实体地址空间中,SRAM地址空间大小可以根据每次处理的图像行大小进行相应设置,两个SRAM实体至少满足能够存储一次输入第一图像行的直方图统计数据。
SRAM读控制单元,接收输入的第一图像行,对于每个直方图根据灰度读取SRAM实体对应存储地址,对灰度像素点个数进行累计,累计值发送至裁剪单元。
裁剪单元,设定裁剪阈值,将裁剪阈值与灰度像素点个数进行比较,将超过裁剪阈值的像素点个数在寄存器中进行累加得到裁剪累计值,将比较结果数据输入至SRAM写控制单元。
SRAM写控制单元,对于像素点个数未超过裁剪阈值的,将累计像素点个数写入SRAM实体相应的地址空间,对于像素点个数超过裁剪阈值的,将裁剪阈值作为该灰度像素点个数写入SRAM实体相应的地址空间。
积分单元,在对第一图像行经过直方图统计模块统计后,启动对每个直方图积分运算,首先,积分单元请求占用直方图统计单元的SRAM读写总线权限,随后对SRAM进行逐地址读取。积分运算具体为对每个直方图各灰度的像素点个数依次累加,得到直方图CDF曲线(Cumulative Distribution Function,累计分布)。积分运算完毕获得一排直方图CDF曲线,对应输入第一图像行的所有直方图,直方图CDF曲线以离散的方式存储在SRAM中,最后积分单元释放对直方图统计单元的SRAM控制权限。
灰度映射单元,读取外部存储模块的第二图像行,结合直方图CDF曲线、裁剪累计值计算第二图像行每个像素点对应四个邻域直方图的映射灰度。
本实施例中CDF曲线计算顶层模块至少设置三个,即建立三个顶层例化,其中两两顶层例化确保SRAM能够缓存两排直方图CDF数据,为后续像素点灰度映射计算能够同时获取上下邻域直方图的映射灰度,灰度映射过程中从外部存储模块中读取相应行数的第二图像行,为保证四个直方图邻域的完整性,需要对直方图区域进行四个象限划分,第二图像行为两个顶层例化对应的第一图像行上半部和下半部结合的图像行,即一个顶层例化对应的第一图像行直方图第三、第四象限部分与第二个顶层例化的第一图像行直方图第一、第二象限部分。三个顶层例化采用乒乓操作,循环缓存逐行输入的第一图像行直方图CDF曲线数据,结合输入相应的第二图像行计算该第二图像行像素点相应的邻域直方图映射灰度,最后结合三个顶层例化的结果最终输出像素点四个邻域直方图映射灰度。
双线性插值模块,根据像素点所在图像坐标计算对应四个邻域直方图映射灰度权重,对四个邻域直方图映射灰度进行双线性插值计算,获得增强像素点灰度。
RGB色空间转换模块,对视频流进行YUV色彩空间转换。
本实施例还包括一种基于FPGA的CLAHE图像增强实时处理方法,采用上述系统进行实施,如图1所示,包括以下步骤:
S1.采集视频流进行YUV色彩空间转换;
FPGA采集到视频流均从RGB转换到YUV色彩空间,其中图像增强是对亮度分量Y进行处理。RGB到YUV色彩空间转换采用以下公式进行,
Y=0.299R+0.587G+0.114B
U=-0.1687R-0.3313G+0.5B+128
V=0.5R-0.4187G-0.0813B+128
其中,R表示RGB色彩空间的红色分量,G表示绿色分量,B表示蓝色分量,Y表示YUV色彩空间的亮度(灰度)分量,U和V均表示色度分量。
S2.根据设定窗口对视频流图像进行直方图区域划分;具体步骤为:
根据设定窗口的大小,对图像进行直方图区域划分;
若图像横向或纵向像素点个数无法被窗口大小整除,则获取相邻的部分行数或列数,结合余数的行或列拼接成完整的直方图区域。
本实施例中窗口大小设置为64*64(单位:像素点),视频流的分辨率为1920*1080@60Hz为例,则1帧图像可以划分为30*17=510个直方图区域。如图5所示,由于高度1080无法被64整除,剩余56行像素点,所以要重复使用上8行的像素行来组成第17排直方图区域。
在经过直方图区域划分后,视频流一方面以窗口高度为大小的行数乒乓存储在外部存储模块即外部DDR中,同时视频流经过复制输入至直方图统计单元进行直方图统计。
S3.至少建立三个基于乒乓操作的顶层例化,对三个顶层例化循环输入第一图像行进行直方图CDF曲线计算,并结合输入第二图像行进行像素点邻域直方图灰度映射计算,输出像素点四个邻域直方图映射灰度。
第一图像行为基于直方图区域划分的窗口高度图像行,
第二图像行为两个顶层例化对应的第一图像行上半部和下半部结合的图像行。
直方图CDF曲线计算包括直方图统计和直方图积分运算,
直方图统计包括,根据输入的窗口高度图像行数据,统计直方图各灰度的像素点个数,累计各灰度下超过设定裁剪阈值的像素点个数,得到裁剪累计值。
获得裁剪累计值包括,设定裁剪阈值,检测各灰度像素点个数,若像素点个数超过裁剪阈值,将裁剪阈值作为该灰度像素点个数,超过裁剪阈值的像素点个数进行累加,得到裁剪累计值。
直方图积分运算包括,设定灰度累计值,遍历当前直方图灰度统计数据,将当前灰度累计值与当前灰度像素点个数相加作为新的灰度累计值,并将新的灰度累计值作为当前灰度的数值,得到当前灰度的灰度累计值,遍历完毕获得直方图所有灰度累计值。
以具体的实例进行说明,根据直方图统计单元的结果可知,在内部建立有两个SRAM实体,如图6所示,在本实施例中每个SRAM实体的深度为4096,位宽为16bit。SRAM实体中每256个地址空间(对应灰度0~255)存放1个直方图统计数据,因此每个SRAM实体最大可容纳16个直方图,两个SRAM实体共计容纳32个直方图。本实施例中以第一图像行输入直方图统计单元进行统计,该第一图像行为基于直方图区域划分的窗口高度图像行,即高度为64行,根据直方图划分第一图像行包括30个直方图,则SRAM实体大小的设置满足本实施例中输入第一图像行需要30个直方图缓冲数量。
根据像素流窗口的奇偶性,直方图的统计数据将间隔分配到这两个不同的SRAM实体中,确保后续的灰度映射运算能同时获取到左右邻域直方图的映射灰度。
SRAM读控制单元以当前像素流的灰度为地址,读取相应直方图区域的像素点个数的统计值,像素点个数的统计值在格式上划分为1bit的标志位+15bit的像素点个数,其中bit15为标志位,通过1和0分别表示统计过和未统计过,bit14-bit0为存放像素点个数。根据SRAM读控制单元返回数据进行直方图灰度像素点个数统计,过程为:
若返回数据bit15为0,表示过去未统计过该灰度,该灰度像素累计值为1,然后通过裁剪单元传递到SRAM写控制单元,由SRAM写控制单元写入对应SRAM实体内。
若返回数据bit15为1,表示过去统计过该灰度,该灰度像素累计数根据[bit14:bit0]的数值进行自加,然后通过裁剪单元传递到SRAM写控制单元,由SRAM写控制单元写入对应SRAM实体内。
其中在统计值经过裁剪单元时进行裁剪判断,设定裁剪阈值,检测灰度像素点个数,若像素点个数未超过裁剪阈值,统计值的像素点个数不做处理;若像素点个数超过裁剪阈值,将裁剪阈值作为该统计值的像素点个数,超过裁剪阈值的像素点个数进行累加,得到裁剪累计值。
直方图积分运算是对SRAM实体中每个直方图空间(每256个地址)内的数据依次进行读取并累加,累加值再次写回到对应地址中,采用如下公式进行计算:
sumreg=sumreg+pcnt(i)
sramwr(i)=sumreg
其中sumreg为累计寄存器中灰度累计值,i代表灰度,pcnt(i)为灰度i的像素点个数,sramwr(i)为需要往SRAM实体中地址为i写入的数据,该数据为灰度i的灰度累计值,写入SRAM实体。
在第一图像行经过直方图统计单元统计后,开启直方图积分运算,首先,积分单元请求占用直方图统计单元的SRAM实体读写总线权限,然后对SRAM实体进行逐地址读取,并进行以下判断:
若返回的数据bit15为0,表示以该地址为灰度的像素点个数为0;
若返回的数据bit15为1,表示以该地址为灰度的像素点个数为[bit14:bit0]。
以256个地址为1个循环进行积分运算,以下采用实例进行说明,其中sramrd(i)代表SRAM实体地址为i的读取数据,读取数据即为当前灰度的灰度累计值。
灰度0的积分运算结果(灰度累计值初始化为0)
Case1:
若sramrd(0)的bit15为0,则pcnt(0)为0,
sumreg=sumreg+pcnt(0)=0+0=0
sramwr(0)=sumreg=0
Case2:
若sramrd(0)的bit15为1,假设sramrd(0)的[bit14:bit0]为20,则表示该直方图区域中灰度0的像素点个数为20个,pcnt(0)为20,
sumreg=sumreg+pcnt(0)=0+20=20
sramwr(0)=sumreg=20
灰度1的积分运算结果(灰度0的积分运算已计算完毕,以灰度0的Case2为基础,即当前灰度累计值为20,进行以下说明)
Case1:
若sramrd(1)的bit15为0,则pcnt(1)为0,
sumreg=sumreg+pcnt(1)=20+0=20
sramwr(1)=sumreg=20
Case2:
若sramrd(1)的bit15为1,假设sramrd(1)的[bit14:bit0]为30,则表示该直方图区域中灰度1的像素点个数为30个,pcnt(1)为30,
sumreg=sumreg+pcnt(1)=20+30=50
sramwr(0)=sumreg=50
灰度2-255的积分运算依次类推,并且在积分运算结果重新写入SRAM实体时,每个地址的bit15均重置为0,为下一轮第一图像行的直方图统计做准备。
在积分运算完毕后,得到30个直方图CDF曲线,采用离散的方式存储在SRAM实体中,这30个直方图CDF曲线组成1排,对应第一图像行的所有直方图,如图7所示。最后,积分单元释放对直方图统计单元的SRAM实体控制权限。
在直方图统计和直方图积分运算后进行灰度映射计算,在灰度映射计算过程中要从外部存储单元中读取相应行数的第二图像行,结合直方图统计和直方图积分运算得到裁剪累计值和直方图CDF曲线,计算像素点对应4个邻域直方图映射灰度。
其中需要根据像素点确定对应4个邻域直方图,其确定过程包括:
将直方图进行四个象限划分,分别为右上的第1象限、左上的第2象限、左下的第3象限和右下的第4象限,根据像素点所在象限位置获取与该象限相邻的3个直方图,以及获取像素点所在直方图,获取的直方图为像素点4个邻域直方图。
本实施例设置三个CDF曲线计算顶层模块,即建立3个顶层例化,每个顶层例化进行直方图CDF曲线计算和直方图灰度映射计算。直方图CDF曲线计算例化3次,其中顶层例化一和顶层例化二确保SRAM实体能缓存2排直方图CDF数据,在后续的灰度映射计算中能够同时获取上下邻域直方图映射灰度。3个顶层例化采用乒乓操作,最后共同输出像素点4个邻域直方图映射灰度。具体过程包括:
a.根据第一图像行排列逐行输入对应顶层例化,进行直方图CDF曲线计算,读取第二图像行分别输入各顶层例化;
b.各顶层例化判断像素点邻域直方图分布位置与其当前第一图像行是否对应重合匹配,若存在匹配,则计算相匹配的邻域直方图映射灰度,获取所有顶层例化的邻域直方图映射灰度,输出像素点对应四个邻域直方图映射灰度;
c.读取下一行第二图像行分别输入各顶层例化,同时对应当前最上行第一图像行的顶层例化输入下一行第一图像行;
d.重复步骤b和c,直至输入最末行第二图像行。
按照本实施例三个顶层例化,如图8所示,假设刚开始计算,顶层例化一输入第一个第一图像行,顶层例化二输入第二个第一图像行,顶层例化三输入第三个第一图像行,并且在执行过一次输入的第二图像行的灰度映射计算后,输入第二个第二图像行同时顶层例化一输入第四个第一图像行,如此循环输入第一图像行。
本实施例中直方图灰度映射计算过程中从外部存储模块中读取相应行数的第二图像行,第二图像行同时输入到三个CDF曲线计算顶层模块。为了保证输入第二图像行像素点4个邻域直方图的完整,输入的第二图像行为两个顶层例化对应的第一图像行上半部和下半部结合的图像行,如图9所示,例如在顶层例化一输入第一个图像行,顶层例化二输入第二个图像行的情况下,读取的第二图像行为顶层例化一对应第一图像行的第3、第4象限部分与顶层例化二对应第一图像行的第1、第2象限部分,即图中顶层例化一和顶层例化二所示两条虚线之间的图像,为从外部存储模块中一次读取的图像。
读取的图像除了第一次和最后一次,中间部分图像都是按照上述操作进行,而第一次从外部存储模块中读取的图像为图像最上部的32行,即顶层例化一对应第一个第一图像行的第1、第2象限部分,该32行的图像只需根据顶层例化一缓存的第一图像行的直方图CDF数据即可计算像素点四个邻域直方图映射灰度,此时三个顶层例化在输入第一图像行后暂不进行乒乓操作,等待第一个64行第二图像行输入。另外最后一次输入的图像行为剩余行数的图像行,根据直方图区域划分所举例子,视频流的分辨率为1920*1080,则最后还剩余24行像素点,作为最后的图像行输入三个CDF曲线计算顶层模块,此时根据顶层例化缓冲的最末行第一图像行的直方图CDF数据即可计算像素点四个邻域直方图映射灰度。
第二图像行输入3个CDF曲线计算顶层模块,根据像素点所在图像位置,相应的顶层例化根据其第一图像行与像素点邻域直方图存在匹配的情况,则计算输出左、右邻域直方图映射灰度,而不存在匹配的顶层例化则不计算输出左、右邻域直方图映射灰度,每次计算存在两个顶层例化输出左、右邻域直方图映射灰度,如图8所示,结合三个顶层例化输出的邻域直方图映射灰度,以及经过映射灰度赋值计算,最终获得像素点对应的四个邻域直方图映射灰度。其中像素点位于边框位置且像素点所在象限相邻边框,则还存在一个顶层例化输出左、右邻域直方图映射灰度,或存在一个顶层例化输出该位于图像四角的邻域直方图映射灰度,其余邻域直方图映射灰度则通过赋值计算获得。
像素点邻域直方图映射灰度通过结合直方图CDF曲线、裁剪累计值进行计算,具体过程包括:
根据当前像素点灰度获取邻域直方图对应灰度的灰度累计值,并获取邻域直方图裁剪累计值;
灰度值累计值与256的乘积值和裁剪累计值相加,相加后的值与窗口面积值相除,相除的值为像素点在邻域直方图的映射灰度。
然后分别在4个邻域直方图进行灰度映射计算,则获得像素点4个邻域直方图的映射灰度。
直方图灰度映射计算采用公式表示如下:
Y(i)=( sramrd(i)*256+ExceedNum)/WindowSize
其中,Y(i)为灰度i在直方图均衡化映射后的灰度值即映射灰度,sramrd(i)为SRAM实体中地址为i的读取数据,即邻域直方图灰度i的灰度累计值,ExceedNum为邻域直方图裁剪累计值,WindowSize为窗口面积值。
在对像素点4个邻域直方图映射灰度计算过程中,若像素点位于图像四周的边框,则不存在完整的4个邻域直方图,因此需要部分直方图重复利用,映射灰度赋值计算包括以下过程:
当像素点所在直方图位于图像四角位置,且像素点所在象限位于图像四角位置,则将像素点所在邻域直方图的映射灰度作为另外三个邻域直方图的映射灰度;
当像素点所在直方图位于图像边框顶部或底部位置,且像素点所在象限相邻图像边框顶部或底部位置,则将像素点所在邻域直方图的映射灰度作为与其垂直相邻的邻域直方图的映射灰度,将与像素点所在邻域直方图水平相邻的邻域直方图的映射灰度作为与其垂直相邻的邻域直方图的映射灰度;
当像素点所在直方图位于图像边框左侧或右侧位置,且像素点所在象限相邻图像边框左侧或右侧,则将像素点所在邻域直方图的映射灰度作为与其水平相邻的邻域直方图的映射灰度,将与像素点所在邻域直方图垂直相邻的邻域直方图的映射灰度作为与其水平相邻的邻域直方图的映射灰度。
以下采用实例进行说明,像素点位于图像的左上角、右上角、左下角、右下角的情况,如图10所示,像素点P位于图像左上角直方图区域的第2象限,则相邻的4个邻域直方图中,邻域A、B、C均不存在,只有邻域D存在,则令Y
像素点位于图像边框的顶部或底部位置情况,如图11所示,像素点P位于图像顶部某直方图区域的第2象限,则相邻的4个邻域直方图中,邻域A、B不存在,邻域C、D存在,则令Y
像素点位于图像边框的左侧或右侧位置,如图12所示,像素点P位于图像左侧某直方图的第2象限,则相邻的4个邻域直方图中,邻域B、C不存在,邻域A、D存在,则令Y
S4.根据像素点所在图像坐标计算对应四个邻域直方图映射灰度权重,对四个邻域直方图映射灰度进行双线性插值计算,获得增强像素点灰度;具体过程包括:
基于像素点坐标计算四个邻域直方图映射灰度权重,根据权重计算双线性插值的中间值,计算如下:
BI
BI
BI
BI
其中BI
根据双线性插值中间量计算增强像素点灰度,计算如下
Y’=(BI
在本实施例中如图8所示, CDF曲线计算顶层模块根据缓存的像素流灰度,定位到相邻4个邻域直方图,最后得到4个不同的映射灰度。具体的根据图13所示举例说明,在所示的双线性插值拓扑结构中,P为某待增强的像素点,位于D直方图区域的第2象限,其在相邻4个邻域直方图的映射灰度分别为Y
例如直方图区域的窗口大小设置64*64,像素点P的坐标(144,80),灰度是50,该灰度在直方图区域A的映射灰度为40、在直方图区域B的映射灰度为45、在直方图区域C的映射灰度为50、在直方图区域D的映射灰度为55,则双线性插值具体计算如下,
Δx=16
Δy=16
BI
BI
BI
BI
Y’=(10240+34560+38400+126720)/( 64* 64)≈51
即初始灰度50的像素点经增强后,得到最终增强像素点灰度为51。
S5.基于增强像素点灰度的图像数据,进行RGB色彩空间转换,进行视频流输出。
YUV到RGB色彩空间转换采用以下公式进行,
R=Y+1.402(V-128)
G=-Y-0.34414(U-128)-0.71414(V-128)
B= Y+1.772(U-128)。
本文中所描述的具体实施例仅仅是对本发明精神作举例说明。本发明所属技术领域的技术人员可以对所描述的具体实施例做各种各样的修改或补充或采用类似的方式替代,但并不会偏离本发明的精神或者超越所附权利要求书所定义的范围。
尽管本文较多地使用了YUV色彩空间转换模块、直方图划分模块、CDF曲线计算顶层模块、双线性插值模块等术语,但并不排除使用其它术语的可能性。使用这些术语仅仅是为了更方便地描述和解释本发明的本质;把它们解释成任何一种附加的限制都是与本发明精神相违背的。
- 一种基于FPGA的实时电子稳像电路系统的处理方法
- 一种基于FPGA的实时电子稳像电路系统的处理方法