主要内容

在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。ImageFilterimfilter(图像处理工具箱)功能在图像处理工具箱™。的imfilter函数对作为矩阵的帧进行操作,并返回一个修改后的作为矩阵的帧。你可以比较这个矩阵和矩阵输出的pix2frm对象。

为了避免对图像处理工具箱许可证的依赖,本教程不执行比较。

HDL代码生成

一旦你的设计在模拟中工作,使用HDL Coder™生成HDL代码HDLTargetedDesign函数。看到从MATLAB中生成HDL代码

相关的话题

Baidu
map