上QQ阅读APP看书,第一时间看更新
1.2.1 生成黑白素描
为了将相机帧转换为一幅素描(黑白图画),可用边缘检测滤波器;而要获得一幅彩色绘画,可采用边缘保留滤波器(双边滤波器)来进一步平滑平整区域,同时保持边缘完好。将素描叠加到彩色绘画上,便可得到一种卡通效果,如前面最终应用程序的屏幕截图所示。
有许多边缘检测滤波器,如Sobel、Scharr和Laplacian滤波器,或者Canny边缘检测器。本章将使用Laplacian边缘滤波器,因为同Sobel或Scharr相比,它所产生的边缘最接近手绘素描,并且它与Canny边缘检测非常一致,可以产生非常干净的线条图,而Canny边缘检测则更易受相机帧中随机噪声影响,因此线条图经常会在帧之间急剧变化。
尽管如此,在使用Laplacian边缘滤波器之前仍需对图像去噪。可使用中值滤波器来去噪,因为它可以在保持边缘的同时去除噪声,而且并不像双边滤波器那么慢。由于Laplacian边缘滤波器使用灰度图像,因而必须将OpenCV默认的BGR格式转换为灰度。将下列代码放在新建的空的cartoon.cpp文件的顶部,这样可在访问OpenCV和STD C++模板时,不需要处处都加前缀cv::和std::。
将下面的代码以及所有后续代码均放到cartoon.cpp文件的cartoonifyImage()函数内:
Laplacian滤波器能生成不同亮度的边缘,为了使边缘看上去更像素描,可采用二值化阈值来使边缘只有黑白两色:
下面这幅图的左边是原图,而右边则是生成的边缘掩码,看起来类似于素描。在生成彩色绘画(稍后解释)之后,我们将会把此边缘掩码蒙在上面来绘制黑色线条: