主要内容

使用双边滤波生成卡通图像

这个例子展示了如何生成卡通线条并将它们覆盖到图像上。

双边滤波[1]在计算机视觉系统中用于在保留边缘的同时对图像进行滤波,在图像处理应用中已经无处不在。这些应用包括在保留边缘的同时去噪,纹理和光照分离用于分割,以及卡通或图像抽象以增强量化彩色图像中的边缘。

双边滤波在概念上很简单:邻域中心的每个像素都被其邻域的平均值所取代。平均数是用一组加权系数计算出来的。权重由邻域中的空间位置(如传统的高斯模糊滤波器)以及与邻域中心值的强度差决定。

这两个加权因子由双边滤波器的两个标准差参数独立控制。当强度标准差较大时,双边滤波器的作用更像高斯模糊滤波器,因为强度高斯的峰值较小。相反,当强度标准差较小时,强度中的边缘被保留或增强。

此示例模型提供了一种硬件兼容的算法。您可以从此算法生成HDL代码,并使用Xilinx™Zynq™参考设计在电路板上实现它。看到基于zynq硬件的双边滤波(基于Xilinx zynq硬件的Vis金宝appion HDL工具箱支持包)

简介

BilateralFilterHDLExample.slx系统显示在这里。

modelname =“BilateralFilterHDLExample”;open_system (modelname);set_param (modelname“SampleTimeColors”“上”);set_param (modelname“SimulationCommand”“更新”);set_param (modelname“开放”“上”);集(allchild (0)“可见”“关闭”);

步骤1:建立参数值

为了实现输入的适度高斯模糊,选择一个相对较大的空间标准偏差3。要对图像的边缘给予强烈的强调,请选择0.75的强度标准偏差。强度高斯分布是由邻近区域的图像数据构建的,所以这个图代表了可能的最大值。注意空间高斯图上的小垂直刻度。

图(“单位”“归一化”“outerposition”,[0 0.5 0.75 0.45]);次要情节(1、2、1);S1 = surf(fspecial(“高斯”,[9 9],3));次要情节(1、2、2);S2 = surf(fspecial(“高斯”,[9 9],0.75));传奇(s1,“空间高斯3.0”);传奇(s2,“强度高斯0.75”);

定点设置

对于HDL代码生成,必须为过滤器系数选择一个定点数据类型。系数类型应该是无符号类型。对于双边滤波,输入范围总是假设在区间上[0, 1]美元.因此,一个uint8输入的值范围为[0255]美元被视为$ $ \压裂{[0255]}{255}$ $.计算出的系数值小于1。系数的确切值取决于邻域大小和标准差。较大的邻域扩展高斯函数,使得每个系数值都较小。较大的标准差会使高斯分布变平,从而产生更均匀的值,而较小的标准差会产生峰值响应。

如果您尝试一种类型,并且系数被量化,使得对于所有输入,核的一半以上变为零,则双边滤波器Block发出警告。如果量化后所有系数都为零,块将发出一个错误。

步骤2:过滤强度图像

该模型使用颜色空间转换器块将传入的RGB图像转换为强度。然后将灰度强度图像发送到双边过滤器块,该块配置为9 × 9的邻域和先前建立的参数。

双边滤波器提供了一些高斯模糊,但将强烈强调图像中基于9 × 9邻域大小的较大边缘。

open_system ([modelname' / HDLAlgorithm '],“力”);

步骤3:计算梯度幅度

接下来,Sobel边缘检测器块计算梯度幅度。由于图像是使用具有相当大邻域的双边滤波器进行预过滤的,因此图像中较小的、不太重要的边缘在边缘检测时不会被强调。

Sobel边缘检测器块的阈值参数可以来自块掩码上的常数值或端口。该模型中的块使用port来允许动态地设置阈值。必须为最终系统计算这个阈值,但是现在,您可以通过观察结果来选择一个好的值。

同步计算边缘

要将阈值边缘覆盖到原始RGB图像上,必须重新对齐两个流。双边滤波器和边缘检测器的处理延迟是指阈值边缘流与输入的RGB像素流没有及时对齐。

像素流校准块将它们重新组合在一起。RGB像素流连接上像素输入端口,二值阈值图像像素连接参考输入端口。块延迟RGB像素流以匹配阈值流。

必须将行数参数设置为允许双边滤波器和边缘检测器的延迟的值。9 × 9双边滤波器的延迟超过4行,而边缘检测器的延迟略多于1行。为安全起见,请设置最大行数到10,以便以后可以尝试不同的社区大小。一旦设计完成,就可以通过观察控制信号波形来确定实际的延迟行数。

颜色量化

颜色量化减少了图像中的颜色数量,使其更容易处理。颜色量化主要是一个聚类问题,因为你想为原始图像中的一组颜色找到一个单一的代表颜色。

对于这个问题,您可以应用许多不同的聚类算法,例如k-means或中值切割算法。另一种常用的方法是使用八叉树,它递归地将颜色空间划分为8个八分。通常,您可以设置树的最大深度,该深度控制将被消除的递归子树,因此由上面子树中的一个节点表示。

这些算法要求你事先知道原始图像中的所有颜色。在像素流视频中,颜色发现步骤引入了不期望的帧延迟。颜色量化通常也最好在感知均匀的颜色空间中完成,如L*a*b。当您在RGB空间中聚类颜色时,不能保证结果对人类观众来说具有代表性。

数字转换该模型中的子系统使用一种更简单的颜色量化形式,该形式基于每个8位颜色组件中最重要的4位。具有8位组件的RGB三元组可以表示到$2^{24} = 2^8 \cdot 2^8 \cdot 2^8$颜色,但没有一个图像可以使用所有这些颜色。类似地,当您将每种颜色的位数减少到4时,图像最多可以包含$2^{12} = 2^4 \cdot 2^4 \cdot 2^4$颜色。实际上,每色4位的图像通常只包含几百种独特的颜色。

在将每个颜色组件向右移动4位后,模型将结果向左移动4位,以保持视频查看器支持的24位RGB格式。金宝app在HDL系统中,接下来的处理步骤将只传递4位颜色RGB三元组。

open_system ([modelname/ HDLAlgorithm /数字转换的],“力”);

覆盖边缘

通过选择RGB流或RGB参数,开关块覆盖原始图像上的边缘。开关根据边缘检测的二值图像进行翻转。因为卡通需要强大的边缘,这个模型没有使用alpha混合器。

参数同步

除了像素和控制信号,还有两个参数进入HDLAlgorithm子系统:渐变阈值和叠加颜色的线RGB三重。的FrameBoundary子系统提供了阈值和线条颜色的运行时控制。但是,为了避免输出帧混合颜色或阈值,子系统只在每个帧的开始处注册参数。

open_system ([modelname“/ HDLAlgorithm / FrameBoundary”],“力”);

仿真结果

运行模拟之后,您可以看到模拟生成的图像在输入视频中检测到的特征周围显示粗体线条。

HDL代码生成

要检查和生成本例中引用的HDL代码,您必须拥有HDL Coder™许可证。

要生成HDL代码,使用以下命令。

makehdl (“BilateralHDLExample / HDLAlgorithm”

要生成测试平台,使用以下命令。请注意,由于数据量大,生成测试台架需要很长时间。考虑在生成测试台之前减少模拟时间。

makehdltb (“BilateralHDLExample / HDLAlgorithm”

在帧到像素和像素到帧之间的部分模型可以在FPGA上实现。HDLAlgorithm子系统包括双边滤波、边缘检测和叠加的所有元素。

要进一步

本例中的双边过滤器配置为强调较大的边缘,同时模糊较小的边缘。若要查看没有双边过滤的边缘检测和叠加,右键单击双边过滤器块并选择通过评论.然后重新运行模拟。更新后的结果表明,许多较小的边缘被检测到,一般来说,边缘的噪声要大得多。

该模型有许多可以控制的参数,如双边滤波器标准差、邻域大小和阈值。邻域大小控制强调边的最小宽度。较小的邻域会导致更多的小边缘被突出显示。

你也可以通过改变RGB叠加颜色和颜色量化来控制输出。改变边缘检测阈值可以控制被覆盖边缘的强度。

为了进一步卡通图像,您可以尝试添加多个双边过滤器。有了正确的参数,就可以生成非常抽象的图像,适用于各种图像分割算法。

结论

该模型通过双边滤波和梯度生成生成卡通图像。该模型将卡通线条覆盖在原始RGB图像的一个版本上,该版本被量化为减少了颜色的数量。该算法适合FPGA实现。

参考文献

[1]托马西,C.和R. Manducji。“灰色和彩色图像的双边滤波。”第六届计算机视觉国际会议,1998。