主要内容

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

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

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

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

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

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

输入文件下载

这个例子使用了potholes2。Avi文件作为输入。该文件的大小大约为50 MB。从MathWorks网站下载该文件,并解压缩下载的文件。

potholeZipFile = matlab.internal.examples.downloadSupportFile (“visionhdl”“potholes2.zip”);[outputFolder, ~, ~] = fileparts (potholeZipFile);解压缩(potholeZipFile outputFolder);potholeVideoFile = fullfile (outputFolder,“potholes2”);目录(potholeVideoFile);

简介

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 =冲浪(fspecial (“高斯”, 9 [9], 3));次要情节(1、2、2);s2 =冲浪(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边缘检测器块的阈值参数可以来自块掩码上的恒定值,也可以来自端口。该模型中的块使用端口允许动态设置阈值。必须为最终的系统计算这个阈值,但是现在,您可以通过观察结果来选择一个好的值。

同步计算过的边

要将阈值边缘覆盖到原始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格式。在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] Tomasi, C.和R. Manducji。灰色和彩色图像的双边滤波。第六届计算机视觉国际会议,1998。

Baidu
map