我是大四学生,毕业设计想用国产高云FPGA做实时视频去雾系统,基于暗通道先验算法。请问硬件化过程中,透射率计算和大气光值估计怎么用流水线实现?需要哪些IP核?资源占用大概多少?有没有推荐的开发板型号?求有经验的前辈指点具体方案和避坑点。
2026年,FPGA毕业设计选基于国产高云FPGA的实时视频去雾系统,暗通道先验算法硬件化有哪些关键步骤?
提问
回答 5

我去年带过类似毕设,说几个关键点。暗通道先验硬件化,透射率计算核心是最小值滤波,别用暴力排序,用行缓存加比较器树做滑动窗口,窗口大小9×9到15×15之间选,太大资源扛不住。大气光值估计建议先做直方图统计,取前0.1%像素的强度均值,这个用BRAM做累加器阵列就能实现,不用乘除法。流水线结构上,把RGB转灰度、暗通道获取、透射率计算、导向滤波四个模块串起来,中间FIFO深度设32就够。IP核方面,高云官方有DDR3控制器和MIPI/HDMI接口IP,视频去雾一般不用第三方IP。资源的话,GW2A-18上能塞下1080p@30fps,LUT大概用70%,BRAM用60%。开发板推荐高云官方的DK-START-GW2A18,或者正点原子的GW2A系列,注意选带DDR3和HDMI的。避坑:导向滤波千万别用浮点,全部定点化,位宽12bit够。你目前RTL仿真环境搭好了吗?

这个问题我刚好在论坛看过几个案例,给你拆成三步说。第一步是算法映射,暗通道先验里有三个耗计算的地方:最小值滤波、透射率求取、导向滤波。最小值滤波用行缓存加比较器树,这个在FPGA上很成熟,关键是把窗口内的最小值比较做成全流水,每拍出一个结果,不要等整帧存完。透射率计算其实就是用暗通道图像和大气光做一次除法加减法,注意大气光值要提前算好作为常数输入,不要每帧动态更新,否则流水线会断。大气光值估计的常用做法是拿暗通道图像的前0.1%亮像素对应原图强度做平均,这个用硬件实现的话,可以做成双阈值累加器:先统计暗通道值大于某个门限的像素总数和强度总和,帧结束时做除法。资源方面,如果你用高云GW2A-55,做1080p@60fps大概需要40k LUT和100个Block RAM,导向滤波如果换用双边滤波替代能省一半资源,但效果会差一点。开发板推荐安路的高云系列或者正点原子新出的GW2A-LV18,注意板上的DDR3颗粒型号要跟IP核配置一致。避坑点:暗通道先验在天空区域会失效,硬件实现时建议加一个天空区域检测模块,把透射率下限钳位到0.2,不然输出发白。另外,高云的开发工具Gowin IDE对Verilog-2001支持还行,但SystemVerilog有些语法会报错,写代码尽量保守。你打算用VGA还是HDMI做输出?接口时序需要针对高云的LVDS原语做适配。

说个容易被忽略的点:暗通道先验的透射率图在硬件里其实不需要整帧存下来再算,你可以用行缓存加比较器树做滑动窗口最小值滤波,每来一行数据就开始算当前像素的透射率,这样整个流水线延迟只有几行。大气光值我是建议在帧消隐期做统计,用两个BRAM分别累加暗通道值大于某个阈值的像素数和总和,帧末做一个定点除法就行。资源上GW2A-18的DSP够用,但BRAM要注意,导向滤波的均值滤波如果用行缓存方案会吃掉不少块,可以考虑换成基于卷积核的简化版。开发板我推荐正点原子的GW2A-55那个,带HDMI和DDR3,调试方便。你打算用哪个版本的Gowin IDE?不同版本对BRAM的分配策略有差异。

既然你选了高云,我多说一句工具链的坑。Gowin的IP核生成器对视频流处理支持得不算特别完善,比如做双端口BRAM的读写时序时,最好自己手写RTL而不是依赖IP Wizard,否则综合出来容易跑不到你要的时钟频率。暗通道先验硬件化最忌讳的就是把软件思维直接搬过来——你在MATLAB里用排序求最小值,FPGA里千万别这么干,用比较器树做滑动窗口才是正路,窗口大小选11×11比较均衡,太大资源撑不住,太小去雾效果打折。大气光值估计的话,你可以参考一个工程化做法:在帧开始前预留一段空白行做暗通道直方图统计,用累加器和比较器找出前0.1%的阈值,然后对原图对应像素做均值。这个模块占不了多少LUT,但要注意把大气光值的计算结果寄存到下一帧开始才更新,避免帧内透射率突变。至于资源,我见过有人用GW2A-18跑1080p@30,LUT用了不到七成,BRAM快满了,所以如果你预算够直接上GW2A-55会比较从容。开发板方面,高云官方的DK-START-GW2A18带HDMI和音频口,适合做视频处理,但DDR3只有128M,存一帧1080p的RGB图还剩不多空间,建议你提前规划好帧缓存策略。对了,你打算用RGB还是YUV输入?这个会影响暗通道提取模块的设计。

我直接说几个容易踩的坑吧。第一个,暗通道先验里那个最小值滤波,千万别想着用排序算法在FPGA里做,那会直接把你的时序干崩。正确做法是用行缓存加比较器树,每个时钟周期只比较窗口内几个像素的最小值,做全流水。窗口大小建议先试9×9,因为11×11虽然效果更好,但在高云GW2A-18上LUT大概会吃掉60%以上,你还要留余量给导向滤波。第二个,大气光值估计,很多人抄论文里取前0.1%像素的方法,但硬件里做精确排序不现实。我见过一个工程做法:在帧消隐期用两个BRAM做累加器,一个统计暗通道值大于某个阈值的像素个数,一个统计对应原图的强度总和,帧末用定点除法算均值。阈值可以手动调,比如取暗通道图像最大值的95%,这样省掉排序逻辑。第三个,导向滤波在硬件里特别吃资源,如果只是为了毕设验证,可以考虑换成快速双边滤波或者干脆只用均值滤波,效果差一点但能跑通。开发板的话,正点原子那个GW2A-55带HDMI和DDR3的板子比较合适,调试方便。你打算用哪个版本的Gowin IDE?我遇到过1.9.9和2024年新版对BRAM综合策略不一样的情况,容易出时序违例。
发表回答
登录后可在本页底部提交回答
