![深入理解OpenCV:实用计算机视觉项目解析(原书第3版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/265/29970265/b_29970265.jpg)
上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::。
![](https://epubservercos.yuewen.com/15B6D4/16499103604974306/epubprivate/OEBPS/Images/005-i.jpg?sign=1738971923-Y6C9AXZ0Ef6w9osGJMKjuUhysUtIOPT0-0-cfc05867ebc9a860818fcf5096db134f)
将下面的代码以及所有后续代码均放到cartoon.cpp文件的cartoonifyImage()函数内:
![](https://epubservercos.yuewen.com/15B6D4/16499103604974306/epubprivate/OEBPS/Images/005-2-i.jpg?sign=1738971923-u9m7Dd5X0lW3N5rvw5ANVwwLsJcZhgl9-0-34b48472b77d3aadccbccf8eabef194e)
Laplacian滤波器能生成不同亮度的边缘,为了使边缘看上去更像素描,可采用二值化阈值来使边缘只有黑白两色:
![](https://epubservercos.yuewen.com/15B6D4/16499103604974306/epubprivate/OEBPS/Images/005-3-i.jpg?sign=1738971923-RBYwPzI1WuVJMT45t8KaiykKHVNOUE4s-0-2216cb987a260a4d6f077a449ea3a29d)
下面这幅图的左边是原图,而右边则是生成的边缘掩码,看起来类似于素描。在生成彩色绘画(稍后解释)之后,我们将会把此边缘掩码蒙在上面来绘制黑色线条:
![](https://epubservercos.yuewen.com/15B6D4/16499103604974306/epubprivate/OEBPS/Images/006-i.jpg?sign=1738971923-a7PgOJ9PW03VE3lxTDD6PIBYJou2h5W6-0-36f9bc0d75914b75ad2435356c0d6db8)