![深入理解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=1739293314-S3m0y9PVeYROQbmmycJpXw9px0DNRqGL-0-5f56388b5669a5c2941efe6da649c31b)
将下面的代码以及所有后续代码均放到cartoon.cpp文件的cartoonifyImage()函数内:
![](https://epubservercos.yuewen.com/15B6D4/16499103604974306/epubprivate/OEBPS/Images/005-2-i.jpg?sign=1739293314-zMt8RtBuPfl8wUwfHAoRc9MTVjgdQagA-0-5e46e5fc9cb4516423e7b974927ff16a)
Laplacian滤波器能生成不同亮度的边缘,为了使边缘看上去更像素描,可采用二值化阈值来使边缘只有黑白两色:
![](https://epubservercos.yuewen.com/15B6D4/16499103604974306/epubprivate/OEBPS/Images/005-3-i.jpg?sign=1739293314-vonsYntZ1XU050hoBE8SyGHJz6RAF8V0-0-9ae302425d395535681c51acb0063494)
下面这幅图的左边是原图,而右边则是生成的边缘掩码,看起来类似于素描。在生成彩色绘画(稍后解释)之后,我们将会把此边缘掩码蒙在上面来绘制黑色线条:
![](https://epubservercos.yuewen.com/15B6D4/16499103604974306/epubprivate/OEBPS/Images/006-i.jpg?sign=1739293314-YqBN1jOR6MmMfRp1Z7S3BqVZa3sCRoQB-0-0db969b323d797e1ad37df2c161686fe)