主要内容

旋转图像小锐角

这个例子展示了如何实现一个小锐角FPGA的图像旋转算法。

图像旋转图像的运动在一个固定的点。这是最常见的一种仿射变换,是许多计算机视觉应用程序根本特征提取和匹配。这个方程表示的仿射变换,旋转新坐标(x, y)美元从原始坐标(u, v)美元通过旋转角\θ美元

左$ $ \[{\{数组}{cc}开始结束x \ \ \{数组}}\右]=左\[{\{数组}{ccc}开始cosθ(\)& # 38;sinθ(\)\ \ sin(\θ)& # 38;cosθ(\)\ \ \{数组}}\右]结束\离开[{\{数组}{cc}开始结束u \ \ \{数组}}\右]$ $

这个实现是基于imrotate(图像处理工具箱)函数。

这个例子计算的变换矩阵的角度范围(-10,0)和(0,10)通过使用ComputeSmallAngleAffineTransform.m函数。这个函数返回的变换矩阵是一个硬件算法的输入。硬件算法执行一个仿射变换和计算输出像素强度使用双线性插值。这个实现不需要外部DDR内存,而是使用片上块RAM存储和重新取样输出像素强度。

图像旋转算法

图像旋转算法使用反向映射技术输出旋转图像的像素位置映射到输入图像的像素。这个图表显示了不同阶段的算法。

计算转换这一阶段计算转换参数利用输入图像尺寸和旋转的角度,\θ美元。这个阶段输出的转换参数包括输出范围和变换矩阵tForm美元。范围帮助计算输出的整数像素坐标旋转图像,和tForm美元变换的整数像素坐标相对应的输出旋转图像输入图像的坐标。

仿射变换一个仿射变换是一个几何变换将一个点在一个图像平面上到另一屏保护图像共线性。共线性意味着直线上的所有点的输入图像变换后仍然形成这条线。图像旋转,将整数输出旋转图像中像素坐标映射到相应的坐标的输入图像通过使用变换矩阵,tForm美元。如果(u, v)美元是一个整数像素坐标旋转输出图像和(x, y)美元相应的输入图像的坐标,然后这个方程式转换。

$ $ [x \水平间距{0.2厘米}y \水平间距z]{0.2厘米}_ {1 x3} = [u \水平间距{0.2厘米}v # xA; \水平间距{0.2厘米}1]_ {1 x3} * tForm ^ {1} _ {3 x3} $ $

双线性插值旋转算法可以产生(x, y)美元noninteger值的坐标。生成的强度在每个整数像素位置,必须使用像插值重采样技术。这个示例使用双线性插值来重新取样图像强度值对应生成的坐标。

方程和图,(x, y)美元是输入像素的坐标由仿射变换生成阶段。I1美元,I2美元,I3美元,当美元是四个相邻的像素,然后呢△美元δy美元是目标像素的位移与其邻近像素。这个阶段的算法计算加权平均的四个相邻的像素用这个方程。

$ $ outputPixel = I1 (1-deltaX) (1-deltaY) + I2 (△) (1-deltaY) + I3 (1-deltaX)(δy) +预告(△)(δy) $ $

HDL实现

这个图显示的顶层视图ImageRotationHDL模型。InputImage阻止进口的图像文件。帧的像素块将输入图像帧转换为用一个像素流pixelcontrol总线的输入ImageRotationHDLALgorithm子系统。这个子系统的输入图像旋转一个角度,你可以指定使用变换块的面具。帧的像素块转换的输出像素帧。的imageview子系统显示输入旋转框架和相应的输出。

open_system (“ImageRotationHDL”);集(allchild (0)“可见”,“关闭”);

InitFcn回调模型计算的例子tForm美元通过调用ComputeSmallAngleAffineTransform.m函数。这个函数需要旋转角和输入图像维数作为输入。你可以设置这些值变换块的面具。或者,您可以生成自己的变换矩阵(6-by-1向量夷为平地,因为最后一列tForm美元是多余的),把它作为输入ImageRotationHDLAlgorithm子系统。

ImageRotationHDLAlgorithm子系统,GenerateControl子系统生成控制信号pixelcontrol公共汽车从输入ctrl总线根据位移参数。的CoordinateGeneration子系统生成的行和列的像素坐标(u, v)美元输出的旋转图像。它使用两个HDL计数器生成行和列坐标。的AffineTransform子系统将这些坐标映射到它们相应的行和列坐标,(x, y)美元的输入图像。

AddressGeneration子系统计算的四个邻居的地址(x, y)美元插值所必需的。这个子系统也计算参数△美元,δy美元,绑定美元,indexVector美元,用于双线性插值。

插值子系统输入图像的像素强度存储在内存中。计算每个旋转输出像素强度、子系统读取四个邻居像素值并计算它们的加权和。

open_system (“ImageRotationHDL / ImageRotationHDLAlgorithm”,“力”);

仿射变换

仿射变换的HDL实现繁殖的坐标(u v 1)变换矩阵,tForm美元(平6-by-1向量,因为最后一列tForm美元是多余的)。的ComputeSmallAngleAffineTransform.m函数,调用InitFcn回调的模型,生成tForm美元矩阵。的转换子系统实现了矩阵乘法与产品模块的输出图像的整数坐标乘以每个元素的tForm美元矩阵。对于该操作,tForm美元从一个向量分割成单个元素是通过使用一个多路分配器块。

open_system (“ImageRotationHDL / ImageRotationHDLAlgorithm / AffineTransform”,“力”);

地址的一代

AddressGeneration子系统映射坐标输入的原始图像(x, y)美元作为输入,然后计算位移△美元δy美元每个像素的相邻像素。该子系统还轮的坐标向负无穷到最近的整数。

open_system (“ImageRotationHDL / ImageRotationHDLAlgorithm / AddressGeneration”,“力”);

AddressCalculation子系统检查对输入图像的边界坐标。如果任何坐标是形象维度外,坐标是封顶的边值进行进一步处理。接下来,子系统计算指数的地址附近的四个像素CacheMemory块中。索引代表缓存的列。子系统发现指数每个地址使用偶数和奇数自然传入的列和行坐标,确定提取的位块。

% = = = = = = = = = = = = = = = = = = = = = = = = = =% |行| |坳| |指数| |% = = = = = = = = = = = = = = = = = = = = = = = = = =奇怪奇怪% | | | | | 1 | |奇怪甚至% | | | | | 2 | |甚至奇怪% | | | | | 3 | |甚至甚至% | | | | | 4 | |% = = = = = = = = = = = = = = = = = = = = = = = = = =

邻域像素的地址生成使用这个方程。

$ $地址=(\压裂{SizeOfColumn} {2} * nR) + nC $ $

nR美元行协调吗数控美元是列坐标。当行美元是偶数,那么$ nR = \压裂{行}{2}1美元。当行美元是奇数,那么$ nR = \压裂{第1行}{2}$。当坳美元是偶数,那么$数控= \压裂{坳}{2}$。当坳美元是奇数,那么$数控= \压裂{坳+ 1}{2}$

IndexChangeForMemoryAccess MATLAB函数块AddressCalculation子系统指数递增的顺序将这些地址。这个操作可以确保正确的数据抓取CacheMemory块。给出的地址作为CacheMemory块的输入,和指标美元,△美元,δy美元被传递到插值子系统。

OutOfBound子系统检查是否(x, y)美元坐标的范围之外的(也就是说,如果任何坐标是图片尺寸)。如果协调界外,相应的输出像素强度值为0。

后所有的地址及其对应的索引生成,一个向量连接块创建向量地址和指数。

插值

插值子系统是一个为每个块复制其操作取决于输入像素的尺寸。例如,如果输入是一个RGB图像,然后输入像素尺寸是1×3,模型包括3这个操作的实例。使用每一块使模型支持RGB输入或输入灰度。金宝app为每个子系统内的操作包括两个子系统:BilinearInterpolationCacheMemory

open_system (“ImageRotationHDL / ImageRotationHDLAlgorithm /插值”,“力”);

高速缓冲存储器

CacheMemory子系统包含一个简单的双端口RAM。子系统缓冲区输入像素组成(线1像素1 | 2像素1 | 1号线像素2 | 2像素2行)的内存。这个配置使算法能够阅读所有四个相邻像素在一个循环。所需的缓存内存的大小的计算抵消的输出ComputeSmallAngleAffineTransform.m函数。偏移量是最大偏差和第一行的和地图。第一行地图输入图像行坐标的最大值对应输出的第一行旋转图像。最大偏差的最大值和最小值最大的区别是每一行的行坐标输入图像行地图。

WriteControl子系统形成矢量的像素,使写,和写地址。的AddressGeneration读地址子系统提供了一个向量。矢量的像素从内存读取的输入BilinearInterpolation子系统。

open_system (“ImageRotationHDL / ImageRotationHDLAlgorithm /插值/ CacheMemory”,“力”);

双线性插值

BilinearInterpolation子系统将从缓存读取像素矢量的原来的指数。然后,BilinearInterpolationEquation子系统计算邻域像素的加权和通过使用双线性插值方程在图像旋转算法中提到的部分。插值的结果输出的值是旋转像素。

open_system (“ImageRotationHDL / ImageRotationHDLAlgorithm /插值/ BilinearInterpolation”,“力”);

仿真和结果

这个例子使用一个480 p的RGB输入图像。输入像素使用uint8数据类型。这个例子支持灰度或RGB金宝app输入图像。这个例子支持范围的锐角(-金宝app10,0)和(0,10)。角大于10度要求更高BRAM资源。

这图显示了输入图像和相应的输出图像旋转的角7度。的结果ImageRotationHDL模型的输入与输出imrotate函数。

检查并生成HDL代码中引用这个例子中,您必须HDL编码器™产品。

生成HDL代码,输入这个命令。

makehdl (“ImageRotationHDL / ImageRotationHDLAlgorithm”)

生成试验台,输入这个命令。

makehdltb (“ImageRotationHDL / ImageRotationHDLAlgorithm”)

这个设计合成使用Xilinx®Vivado®ZC706设备和满足时间要求超过200 MHz。此表显示了HDL子系统的资源利用率。

% = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =% |模型名称| | ImageRotationHDL | |% = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =输入图像分辨率% | | | 480 x 640 | |% |附近地区| | 2238 | |% | FF | | 2570 | |% | BRAM | | 96 | |% |总DSP模块| | 94 | |% = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =