FPGA的图像处理是怎么做到的?在FPGA的编程语言里最容易犯的错误!

发布时间:2018-05-16 14:03

FPGA的图像处理是怎么做到的?


基于软件的图像处理方法存在着一些局限性,尤其是计算速度和算法效率方面。所以大家很自然的就想到了FPGA作为嵌入式图像应用的平台。许多图像处理本身就是并行计算的,并且FPGA的编程硬件,本质上也是并行的。


但是利用FPGA硬件进行图像处理存在很多的困难,需要学到很多的技巧。下面介绍两几种比较基础的图像处理算法思想。


点操作

  

单幅图像的点操作是图像处理中最简单的操作,输出值只取决于输入值,与位置无关,可以看作是一个函数的映射。从硬件实现的角度来说,最简单的方式就是通过一个实现函数的模块对输入的每个像素进行依次处理,也就是流水化处理。每个像素都是单独处理的,可以把图像分为若干部分,每个部分单独处理,所以点操作容易并行实现。点操作可作为读取图像和后续处理之间的一个桥梁。


亮度调节

为了使图像变亮,可以增大输出像素值,可以通过加一个常量实现。类似地,变暗减小像素值。但是实际中,调节亮度要复杂的多,因为人的视觉系统是非线性的。


对比度调节

图像的对比度受映射函数的斜率影响。斜率大于1增强,小于1则降低,可以通过乘以一个大于或者小于1的常数实现。


同时调节亮度和对比度

一个简单的调节它们的点操作是:Q=aI+b=a(I+b’),a,b是控制亮度和对比度的任意常数。


当Q超出范围怎么办?如用8位表示像素值时,Q超出0~255,那么输出怎么办?


默认情况下只取8位最低有效位并且忽略任何会导致值超出范围的溢出位。通常还需要进行饱和或者裁剪到极值效果会更好。

  

直方图操作


使用直方图的图像处理有两个相关的主要步骤。第一步是建立直方图,第二步是从直方图中提取数据并用它来处理图像。


建立直方图:对每个像素值累计计数。通过计数器数组完成计算每个像素值出现的次数。这个方法的缺点是占用的硬件资源比较多,适合阈值后的直方图计算。可以使用双口存储器实现,可以大大减少逻辑资源的使用。



直方图均衡化:使用局部信息来分配那些在输出像素值的范围上具有大的计数值的输入值的像素来获得更平坦的直方图。实现直方图均衡化的映射是归一化累积直方图。直观地,如果输入点集合的计数值大于平均值,那么映射的斜率大于1,反之,小于1。

  

局部滤波器


局部滤波器扩展点操作,以一个局部窗口内像素值的函数运算结果作为输出。窗口的大小、形状可以随意,但是一般都是采用奇数正方形的,见过最多的就是3x3,5x5,7x7,这样的话中心就很容易确定。局部滤波器有去噪、边缘检测、边缘增强等。


线性去噪有排序去噪,均值去噪,加权均值去噪等,边缘检测可以利用Prewitt,Sobel算子等,将这些算法在3x3窗口中实现,相对来说就比较容易了。也可以改进这些算法,是写小论文比较好的创新点。还有一些形态学滤波器,颜色滤波器,大致思想都一样,就是实现的时候算法改一下。


在FPGA的编程语言里最容易犯的错误


逻辑写多了,有时候一些基本的错误忘了避免了。

  

昨天设计逻辑的时候就不小心触雷了,有个信号有激励没响应,后来看了时序报告,有这么一句话。

    


这是什么呢?锁存器啊!

  

最容易产生的是在always(*)语句中,最后一定是所有分支条件都要描述并赋值。

  

状态机中,同样如此,不但需要有default的状态,每个状态的都要有所有的分支都要赋值。

  

如果设计很大,不容易查的话,可以打开综合报告,搜索“LATCH”关键词,查看是否有锁存器的产生,有就赶紧更改设计。

  

而时序逻辑综合结果必然是触发器,因此不用检查时序逻辑的分支条件。所以还是那句话,能用时序逻辑,就尽量别用组合逻辑。

  

当然如果是老手,这句话可忽略。

  

阻塞和非阻塞,这件事情百分之九十九点九九是笔误,没见过开发者没事非要冒险试一下“=”跟“<=”的区别。

  

很多人说这两个没啥区别,这两个符号啊,没出事就好,出事了查起来就烦了。

  

所以记好了,组合逻辑里面用=,时序逻辑里面用<=,肯定不会错。

  

硬件描述语言的坑还是很少的, 搞来搞去就是组合逻辑、时序逻辑,一些generat加for循环就算复杂的了,因此这块能说的不多。

  

编程语言不是语言本身,而是每句逻辑之后的电路,新手入门学习的初学者一定要注意。

↓↓↓↓点击阅读原文,查看更多新闻

powered by 白菜全讯最新白菜 © 2017 WwW.daizitouxiang.com
博聚网