上QQ阅读APP看书,第一时间看更新
1.2.2 生成彩色绘画和卡通
强大的双边滤波器可平滑平整区域,同时保持边缘锐利,因此它作为一个自动的卡通化或绘画滤波器是很不错的,其缺点是效率低(即该滤波器运行的时间要按秒,甚至要按分钟而不是毫秒来计算)。因此,本书采取一些技巧来获得一张漂亮的卡通化图像,同时速度也可以接受。最重要的技巧在于:在低分辨率下执行双边滤波器,它仍与全分辨率效果类似,但运行速度更快。例如,我们将像素总数减少至1/4(图像的宽和高各减少一半):
可通过多个小型双边滤波器来代替一个大型双边滤波器,从而在较短时间内得到很好的卡通化效果,本书通过截断滤波器(见下图)来代替执行整个滤波器(例如若钟形曲线有21个像素宽,则整个滤波器大小为21×21),截断滤波器是指能达到满意效果的最小滤波器(例如,虽然钟形曲线的大小为21×21,但仅使用9×9的滤波器就可以达到满意效果)。截断滤波器会使用滤波器的主要部分(下图曲线的灰色区域)而不会浪费时间在滤波器的较小部分(下图曲线的白色区域)上,这样会使滤波器的效率提高几倍:
因此,有四个参数来控制这个双边滤波器:色彩强度、位置强度、大小和重复次数。bilateralFilter()函数不能覆盖其输入(这称为就地处理),因此需要一个临时变量Mat,该变量作为一个滤波器的输出,并充当另外一个滤波器的输入:
注意该处理过程,使用的是缩小后的图像,因此,在处理后需将图像恢复到原来的大小,然后叠加前面得到的边缘掩码。为了将边缘掩码素描效果叠加到由双边滤波器所产生的绘画上(下面图中左边那幅图像),可以从黑色背景开始,并复制素描掩码中不含边缘的绘画像素:
这会得到原图的卡通版,如右图所示,从而将素描掩码覆盖到彩色绘画上: