可能不是很多人知道VisualApplets这款软件,所以先介绍一下。VA是SiliconSoftware公司推出的用于图像处理的软件开发平台,它的主要特点是实现了图像化FPGA设计和编程的环境。VA的操作界面和LabVIEW类似,只需要拖拽算子就可以进行图像处理,所以相对来说简单一点。VA提供一系列的图像预处理Applet,通过组合Applet可以定制自己的图像处理功能。此外,这些Applet可以被加载到SiliconSoftware公司生产的MicroEnable系列的图像采集卡中,运行时不占用系统CPU资源,是图像预处理软件硬件化的平台。所有的功能模块都以硬件算子的方式提供,保证了实时处理的要求,图形处理的复杂度仅局限于使用的FPGA的资源。刚开始学习VA,所以做的会比较慢,问题应该也比较多,希望能尽快完成任务。
这一部分比较简单,输入是从相机中接入的图像,这边是用BaseGrayCamera算子;输出则是将处理好的图像输入到PC端,算子是DmaToPC,这两者都是在所选的图像采集卡类型(mE5-MA-VCL)里选择。另外,在输入与输出之间一般都得加上ImageBuffer算子(memory),不然会报错。仿真是利用Simulation Module算子,一个是SOURCE用来显示输入的图像,另一个是PROBE用来显示处理后的图像。最后用Design Rules Check Level 1和Level 2来检验代码是否合理,然后Start Simulation观察是否达到自己想要的图像处理效果。整个界面如下图所示,另外,如果需要多次仿真的话,需要先用Reset将上次仿真的结果先清除。
简单框架 |
在进行复杂的图像处理流程时,要用到HierarchicalBox算子,相当于Matlab中自定义的函数,如下图所示。
均值框图 | 均值公式 |
根据上面的均值公式来进行算子的选择。首先,要用到5×5的滑动窗,通过25个像素的平均值求解来得到均值。滑动窗的使用要利用到FIR系列的两个算子(filter),也就是FIRkernelN×M和FIRoperatorN×M。其中,两者之间的连接线用来设定滑动窗的尺寸大小,默认为3×3,这边改为5×5;后者可以用来设定滑动窗内部数值大小,因为这边求的是均值,所以全部设为1。因为是求均值,所以还需要除以25这个常数,也就要用到CONST算子(base),它可以将输入值替换为常量,常量由参数Value来定义。而由于要同时进行相加和相除的操作,就要用到BRANCH算子(base)来进行分路,设置值为2。之后就要用到除法算子DIV(arithmetics),值得注意的是,DIV算子会有两个输出,一般来说只需要输出链路O处提供的整数结果,输出链路R处提供的除法的剩余部分则用Trash算子(base)去除。这边最后输出线路会变成红色,错误显示图如下,可以看出是Bit Width不相对应所导致的问题。这种情况可以加一个CastBitWidth算子(base)来调整位宽,所以最后mean-HierarchicalBox算子内部的结构图如下,最终仿真的效果也不错。
错误详情图 | mean算子内部结构图 |
标准差公式 |
根据上图中的标准差的公式来进行算子的选择,可以看到,标准差的计算会用到mean算子,所以要巧用HierarchicalBox算子。在求得mean之后,可以利用BRANCH算子将原图数据与mean操作后的图像相减,所用算子是SUB(arithmetics)。然后用MULT算子(arithmetics)来对相减后的图像进行点乘计算,接着继续利用FIR系列算子对它进行滑动窗计算,与上面类似。之后要对它进行开平方计算,利用SQRT算子(arithmetics)。这边也同样出现了位宽问题,继续用CastBitWidth算子来调整。最后sd-HierarchicalBox算子内部的结构图如下,以及仿真的原图和处理后的效果图。
算子结构图 | 原始图像 | 处理图 |