本文转载自: PYNQ开源社区微信公众号
感兴趣者可与 pynq_china@xilinx.com 联系,共同合作拓展项目。
日常拍照时,我们有时会遇到拍出来的照片失焦的情况。如果拍下的瞬间比较难得,这样的情况就更加可惜了。但是,利用FPGA进行编程,这些照片可能还能”拯救一下“!
今天,小编为大家带来暑期学校优秀项目之失焦图像去模糊系统的分享。
本项目已在GitHub开源,如果有感兴趣的同学,请务必访问GitHub库,上手试试看哦!
项目简介
本设计目标是针对如对焦不准等因素产生的模糊照片进行清晰化、去模糊操作。
在本次的设计实践中,我们学习到了如下内容:
1. 图像恢复算法
在最初的算法调研以及在PC上对算法进行模拟仿真时,我们首先了解了光学成像产生模糊退化数学模型及常见的点扩散函数。然后对还原过程相关的直接反卷积法、维纳滤波、最小二乘反卷积法、LR迭代法以及一些运动模糊逆滤波的算法进行了python仿真,进行图像的加模糊和去模糊,比较了各个算法的效果及复杂程度,最后选定了维纳滤波算法进行HLS移植。
2. HLS相关内容
整体结构参考canny例程,使用AXI接口来进行数据的交互,学会了与常规C语言略有不同的数据流读取方法。
针对维纳滤波过程中所需要的傅里叶变换过程,参考HLS中的一维FFT例程实现了二维FFT操作,对FFT的参数配置、溢出等内容以及相关的文档有了进一步的了解。
在实现矩阵的点乘、共轭等双层循环操作时,使用数组划分、矩阵展开、流水操作等方式来进行优化,将之前课程所学知识学以致用。
期望的设计应用方向
能够借助zynq的PL端加速功能实现高速的图像去模糊,然后实施处理如监控摄像头、手持摄像机等设备的每一帧输出图片,修正其因对焦不对等原因产生的照片模糊。
效果展示
原图:
模糊图像:
恢复图像:
实物图像:
实现的功能
对本地图片、摄像头输入图片的读取及PS-PL端的数据通信。(但是目前主要还是对本地图片进行处理)。
PL端能够对得到的图片数据进行二维傅里叶变换,通过维纳反卷积获得复原图像的频谱,再通过逆傅里叶变换得到新的图像。
但是目前位置只能对自己生成的图像进行效果一般的去模糊,还不能对相机等设备自然拍摄出的图像进行有效的去模糊。
系统框图
技术方向
目前来讲,成像器件与探测目标直接的大气湍流、相对运动、CCD欠采样等因素都会造成图像的模糊。除了采用更加昂贵的光学元件及CCD外,软件算法去除模糊是一种十分经济的提高成像质量的方式。
在图像处理这种经常需要用的卷积和并行运算的计算处理上,FPGA并行加速的优势可以很容易的发挥出来,达到常规运算设备难以企及的处理速度,使得成像器件发出的图像数据能够被及时的处理,便于实现图像的即时去模糊等操作。
Github链接: https://github.com/PaiPai121/Defocus-Image-Deblurring-Based-on-PYNQ ,直达GitHub库!