在MATLAB中设计硬件目标图像滤波器
这个例子展示了如何使用Vision HDL Toolbox™对象设计一个面向硬件的图像过滤器。
MATLAB®中面向硬件的视频处理模型的主要特征是:
流像素接口:在Vision HDL工具箱中的系统对象使用流像素接口。串行处理对于硬件设计是有效的,因为存储像素数据所需的内存更少。串行接口使对象独立于图像大小和格式运行,并使设计对视频定时错误更有弹性。有关更多信息,请参见流像素接口.
针对HDL代码生成的函数:一旦数据转换为像素流,您就可以通过从Vision HDL Toolbox库中选择System对象来设计硬件模型。针对HDL代码生成的设计部分必须在单独的功能中。
转换到基于帧的视频:为了验证,您可以显示基于框架的视频,或者您可以将硬件兼容设计的结果与基于MATLAB框架的行为模型的输出进行比较。Vision HDL Toolbox提供了一个系统对象™,使您能够反序列化设计的输出。
导入数据
将一个图像文件读入工作区。这个示例图像包含256×256像素。每个像素都是单一的uint8
代表强度值。若要在测试时降低模拟速度,请选择图像的缩略图部分。
用MATLAB解释语言模拟串行视频是很耗时的。在使用较小的图像大小调试设计之后,使用MEX代码生成来加速使用较大图像的测试。看到使用MATLAB编码器加速像素流设计.
origIm = imread (“rice.png”);origImSize = size(origIm) imActivePixels = 64;imActiveLines = 48;inputIm = origIm (1: imActiveLines, 1: imActivePixels);图imshow (inputIm,“InitialMagnification”标题,300)输入图像的
origImSize = 256 256
序列化数据
的visionhdl。FrameToPixels
系统对象将帧视频转换为像素流和控制结构。该对象为针对HDL代码生成的函数提供输入,但它本身不支持HDL代码生成。
若要使用标准视频格式进行模拟,请选择与输入源匹配的预定义视频填充格式。若要使用自定义大小的图像进行模拟,请选择非活动区域的尺寸来包围图像。本教程使用自定义图像。的属性visionhdl。FrameToPixels
对象对应于图中的维度。
创建一个visionhdl。FrameToPixels
对象,并设置图像属性。该图像是具有表示每个像素的标量值的强度图像,因此设置NumComponents
属性为1。本教程在缩略图的上下各填充了5个非活动行,每行的前后各填充了10个非活动像素。
使用getparamfromfrm2pix
函数从序列化器对象获取有用的图像尺寸。此语法将丢弃前两个返回值,只保留填充帧中的像素总数。调用该对象将图像转换为像素向量和控制信号向量。
注意:该语法只在R2016b或更高版本中运行。如果您使用的是较早的版本,请将对象的每次调用替换为等价的对象一步
语法。例如,替换myObject (x)
与步骤(myObject x)
.
frm2pix = visionhdl。FrameToPixels (...“NumComponents”, 1...“VideoFormat”,“自定义”,...“ActivePixelsPerLine”imActivePixels,...“ActiveVideoLines”imActiveLines,...“TotalPixelsPerLine”imActivePixels + 20,...“TotalVideoLines”imActiveLines + 10,...“StartingActiveLine”6...“FrontPorch”10);[~, ~, numPixelsPerFrame] = getparamfromfrm2pix (frm2pix);(像素,ctrl) = frm2pix (inputIm);
设计HDL-Compatible模型
控件中选择图像处理对象visionhdl
图书馆。本教程使用visionhdl。ImageFilter
.
构造一个包含此对象的持久实例的函数。该函数通过执行对对象的一个调用来处理单个像素。
的ctrlIn
而且ctrlOut
对象的参数是包含五个控制信号的结构。这些信号表明每个像素的有效性和每个像素在帧中的位置。
的滤波系数visionhdl。ImageFilter
执行2×2 blur操作。
对于本教程,您不需要更改LineBufferSize
属性。该参数不影响模拟速度,因此在用小的测试图像进行模拟时不需要修改。在选择LineBufferSize
,选择2的幂,以适应所需的最大帧格式的活动行大小。默认值为2048,支持1080p视频格式。
函数[pixOut, ctrlOut] = HDLTargetedDesign (pixIn ctrlIn)持续的filt2d如果Isempty (filt2d) filt2d = visionhdl。ImageFilter (...“系数”, (2, 2) / 4,...“CoefficientsDataType”,“自定义”,...“CustomCoefficientsDataType”numerictype (0, 1, 2),...“PaddingMethod”,“对称”);结束[pixOut, ctrlOut] = filt2d (pixIn ctrlIn);结束
为更有效的模拟预先分配输出向量。然后,为填充帧中的每个像素调用该函数一次像素
向量。
pixelOut = 0 (numPixelsPerFrame 1“uint8”);ctrlOut = repmat (pixelcontrolstruct numPixelsPerFrame 1);为p = 1:numPixelsPerFrame [pixelOut(p),ctrlOut(p)] = HDLTargetedDesign(像素(p),ctrl(p));结束
反序列化经过过滤的像素流
的visionhdl。PixelsToFrame
系统对象将像素流转换为基于帧的视频。使用此对象对筛选后的数据进行反序列化visionhdl。ImageFilter
.设置图像尺寸属性以匹配测试图像。调用该对象将以hdl为目标的函数的输出转换为矩阵。
pix2frm = visionhdl。PixelsToFrame (...“NumComponents”, 1...“VideoFormat”,“自定义”,...“ActivePixelsPerLine”imActivePixels,...“ActiveVideoLines”imActiveLines,...“TotalPixelsPerLine”, imActivePixels + 20);[outputIm, validIm] = pix2frm (pixelOut ctrlOut);
显示结果
使用imshow
函数显示操作的结果。
如果validIm图imshow (outputIm,“InitialMagnification”标题,300)输出图像的结束
与行为模型相比
如果你有一个设计的行为模型,你可以比较输出帧的视觉或数学。对于过滤,您可以进行比较visionhdl。ImageFilter
与imfilter
(图像处理工具箱)功能在图像处理工具箱™。的imfilter
函数对作为矩阵的帧进行操作,并返回一个修改后的作为矩阵的帧。你可以比较这个矩阵和矩阵输出的pix2frm
对象。
为了避免对图像处理工具箱许可证的依赖,本教程不执行比较。
HDL代码生成
一旦你的设计在模拟中工作,使用HDL Coder™生成HDL代码HDLTargetedDesign
函数。看到从MATLAB中生成HDL代码.