目录

  • 1.如何使图像卡通画
  • 2.铅笔素描滤波器
  • 3. 细节增强滤波器
  • 4. 双边过滤器
  • 5. 铅笔边缘滤波器

1.如何使图像卡通画

我们通常需要执行两个主要步骤将图像转换为卡通图像:边缘检测和区域平滑。
边缘检测的主要目的显然是为了强调图像的边缘,因为卡通图像通常具有良好的边 缘。同时,区域平滑的主要目的是消除颜色边界并减少图像的噪点,使图像像素化程 度降低。
根据不同滤波器,我们可以获得不同的图像卡通化结果。在本文中,将有四个不同的 过滤器:

  • 铅笔素描
  • 细节增强
  • 双边过滤器
  • 铅笔边缘

接下来,我们将展示如何应用每个过滤器,以及从每个过滤器中获得什么样的结果。

2.铅笔素描滤波器

使用“铅笔素描”滤波器,您的图像将被转换为素描,就像使用铅笔绘制图像一样。下 面是使用OpenCV将图像转换为铅笔素描的完整代码。

int main()
{cv::Mat img = cv::imread("/Users/xialz/Downloads/7.jpg");cv::Mat gray_img;cv::cvtColor(img, gray_img, cv::COLOR_BGR2GRAY);cv::Mat gauss_img;cv::GaussianBlur(gray_img, gauss_img, Size(25,25), 0);cv::Mat cartoon;cv::divide(gray_img, gauss_img, cartoon, 255);cv::imshow("cartoon", cartoon);cv::waitKey(0);return 0;
}

令人惊讶的是,使用OpenCV,我们只需三行代码就可以将图像转换成铅笔素描状的图 片。现在让我逐行解释一下该图像发生了哪些变化。 在第一行中,我们使用OpenCV的cvtColor()功能将图像从彩色通道转换为灰度通 道。这很简单,处理的结果是我们将图像变成了灰度图。 接下来,我们使用高斯模糊对图像进行模糊处理。模糊灰度图像,实际上是在平滑图 像,减少图像的噪点。另外,模糊也是我们检测图像边缘的必要步骤。
模糊图像,可以使用OpenCV中的GaussianBlur()功能。我在GaussianBlur() 函数中输入的(25,25)是内核的大小。 由于我们使用高斯模糊,因此内核中像素值的分布遵循正态分布。核数越大,标准偏 差将越大,因此模糊效果越强。
最后一步是将原始灰度图像除以模糊后的灰度图像。这样可以得出两个图像中每个像 素之间的变化率。模糊效果越强,每个像素的值相对于其原点的变化就越大,因此, 它使我们的铅笔素描更加清晰
以下是使用铅笔素描过滤器的结果

3. 细节增强滤波器

简而言之,“细节增强”滤镜通过锐化图像,平滑颜色以及增强边缘效果为我们提供了 卡通效果。以下是使用此滤镜将您的图像转换成卡通的完整代码。

int main()
{cv::Mat img = cv::imread("/Users/xialz/Downloads/7.jpg");cv::Mat gray_img;cv::cvtColor(img, gray_img, cv::COLOR_BGR2GRAY);cv::Mat median_img;cv::medianBlur(gray_img, median_img, 3);cv::Mat cartoon, edges, color;cv::adaptiveThreshold(median_img, edges, 255, BORDER_REPLICATE, cv::ADAPTIVE_THRESH_MEAN_C, 3,0);cv::detailEnhance(img, color, 5, 0.5);cv::bitwise_and(color, color, cartoon, edges);cv::imshow("cartoon", cartoon);cv::waitKey(0);return 0;
}

第一步与之前相同,我们需要将图像转换为灰度图像。 接下来,不使用高斯模糊,而是应用中值模糊。为此,我们使用OpenCV中的 medianBlur() 函数。中值模糊通过计算与内核重叠的像素值的中值,然后将其中 心像素替换为中值。但是,我们可以根据需要先使用高斯模糊。 接下来,我们需要检测图像的边缘。为此,将自适应阈值与OpenCV中的 adaptiveThreshold() 函数一起应用。自适应阈值的主要目标是根据内核重叠的 像素的平均值,将图像每个区域中的每个像素值转换为黑色或白色。 以下是自适应阈值对模糊图像的影响的可视化结果。


左:自适应阈值之前—右:自适应阈值之后
为了使图像看起来更清晰,我们可以使用OpenCV中的detailEnhance()函数。我 们需要指定两个参数:
• sigma_s:控制着邻域的大小,该邻域的大小将被加权以替换图像中的像素值。值 越高,邻域越大。这样可以使图像更平滑。
• sigma_r:如果要在平滑图像时保留边缘,这很重要。较小的值只会产生非常相似 的颜色进行平均(即平滑),而相差很大的颜色将保持不变。 最后,我们使用自适应阈值的结果作为掩码。然后,根据蒙版的值合并细节增强的结 果,以创建具有清晰边缘的清晰效果。 以下是“细节增强”过滤器的示例结果。

细节增强过滤器实现示例

4. 双边过滤器

使用双边滤镜的一大优势是,我们可以在保留边缘的同时使图像和颜色平滑。以下是 通过双边过滤将您的图像转换为卡通图像的完整代码。

int main()
{cv::Mat img = cv::imread("/Users/xialz/Downloads/7.jpg");cv::Mat gray_img;cv::cvtColor(img, gray_img, cv::COLOR_BGR2GRAY);cv::Mat median_img;cv::medianBlur(gray_img, median_img, 3);cv::Mat cartoon, edges, color;cv::adaptiveThreshold(median_img, edges, 255, BORDER_REPLICATE, cv::ADAPTIVE_THRESH_MEAN_C, 3,0);//cv::detailEnhance(img, color, 5, 0.5);cv::bilateralFilter(img, color, 15, 20, 10);cv::bitwise_and(color, color, cartoon, edges);cv::imshow("cartoon", cartoon);cv::waitKey(0);return 0;
}

如果仔细看,所有步骤都与“细节增强”过滤器中的步骤相似,但是这次不是使用 detailEnhance() 函数,而是使用openCV中的bilateralFilter()函数。
调用此函数时需要传递的参数与detailEnhance()相同,只多一个附加参数,即内 核大小d。首先,我们指定图像源,然后是d,sigma_s和sigma_r值控制平滑效 果,并保持边缘。 以下是使用双边过滤器的结果示例。

5. 铅笔边缘滤波器

铅笔边缘滤镜可创建仅包含重要边缘和白色背景的新图像。要应用此滤波器,下面是 完整的代码。

int main()
{cv::Mat img = cv::imread("/Users/xialz/Downloads/7.jpg");cv::Mat gray_img;cv::cvtColor(img, gray_img, cv::COLOR_BGR2GRAY);cv::Mat median_img;cv::medianBlur(gray_img, median_img, 3);cv::Mat cartoon, edges, edges_inv;cv::Laplacian(median_img, edges, -1, 3);edges_inv = 255 - edges;cv::threshold(edges_inv, cartoon, 150, 255, cv::THRESH_BINARY);cv::imshow("edges_inv", edges_inv);cv::imshow("cartoon", cartoon);cv::waitKey(0);return 0;
}

前两个步骤与其他过滤器相同。首先,我们将图像转换为灰度图像。接下来,我们使 用大小为25的内核对图像进行模糊处理。 接下来,我们应用拉普拉斯滤波器来检测边缘。根据内核的大小,拉普拉斯滤波器中 的值可以不同。 Laplacian滤波器的工作是,将通过对象内部的灰度级和图像背景强度来突出对象的边 缘。以下是拉普拉斯滤波器应用结果。

左:拉普拉斯滤波器应用之前—右:拉普拉斯滤波器应用之后
接下来,我们将Laplacian滤波器的结果求反。最后,通过应用openCV中的 threshold()函数,根据指定的阈值将灰度图像转换为全黑或全白。 以下是“铅笔边缘”过滤器的结果示例

来源于:Python视觉实战项目71讲(更新).pdf,将代码由python改成了c++

opencv实践项目-图像卡通化相关推荐

  1. 使用OpenCV实现人脸图像卡通化

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 引言 通过前面的文章我们已经了解到OpenCV 是一个用于计算机视 ...

  2. python多张照片拼成一张人脸,使用OpenCV实现人脸图像卡通化的示例代码

    引言 通过前面的文章我们已经了解到OpenCV 是一个用于计算机视觉和机器学习的开源 python 库.它主要针对实时计算机视觉和图像处理.它用于对图像执行不同的操作,这些操作使用不同的技术对图像进行 ...

  3. opencv 图片边缘渐变_基于OpenCV的图像卡通化

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本期将创建一个类似于Adobe Lightroom的Web应用程序 ...

  4. OpenCV-Python实战(番外篇)——OpenCV实现图像卡通化

    OpenCV-Python实战(番外篇)--OpenCV实现图像卡通化 前言 图像卡通化 完整代码 更多卡通化效果展示 相关链接 前言 在博文<OpenCV-Python实战(4)--OpenC ...

  5. 基于Opencv的图像卡通化

    基于Opencv的图像卡通化 基于Opencv的图像卡通化 铅笔素描效果 国画效果 抽象效果 基于Opencv的图像卡通化 主要工具是高斯滤波器.细节增强滤波器.双边滤波.拉普拉斯滤波器. 铅笔素描效 ...

  6. OpenCV实现图像卡通化

    一.前言 今天介绍一个有趣的demo,结合之前图像空域滤波和边缘检测的知识,实现图像卡通化,通过实现的过程,可以发现几种图像边缘检测和差异和图像滤波的性质. Demo来自<Mastering O ...

  7. 【Python-OpenCV 人脸图像卡通化】

    Python-OpenCV 人脸图像卡通化 前言 一.边缘检测和滤波 二.使用步骤 1.引入库 2.处理图像 3.展示结果 总结 前言 OpenCV 提供了丰富的图像滤波和边缘检测的算法,可利用其为照 ...

  8. 《Learning to Cartoonize Using White-box Cartoon Representations》图像卡通化论文解析

    这篇文章收录于CVPR2020,在图像卡通化上效果不错. github地址:https://github.com/SystemErrorWang/White-box-Cartoonization 那么 ...

  9. opencv实践项目-人脸检测

    目录 1. opencv CascadeClassifier人脸检测步骤 2. CascadeClassifier分类器简介 2.1 从文件中加载级联分类器 2.2 目标检测方法 3. 代码实现 1. ...

最新文章

  1. 卫星的性能和服务器比较,卫星通信的常用频段的详细对比
  2. 测开之路十五:构造函数、析构函数
  3. c++矩阵作为函数输入变量_C++实现矩阵乘法
  4. ARM嵌入式系统malloc的实现(C源码)
  5. 隐私与AI兼得,蚂蚁金服是如何做到的?
  6. [Node.js] ES6新语法
  7. 收获,不止SQL优化——抓住SQL的本质--第二章
  8. 12,mac phpstorm xdebug
  9. 分享一个Winform里面的HTML编辑控件Zeta HTML Edit Control,汉化附源码
  10. Linux文件夹设置共享
  11. 计算机科学中的哲学思想,冯·诺依曼的计算机科学哲学思想
  12. 大数据——DBT:dbt的数据质量监控插件re_data二次开发及编译(生产环境篇)
  13. 给btn添加hover、active、focus效果
  14. html语言制作表格模板,十个最简单实用的Table设计模板
  15. 解决方案的四种落地形态
  16. MySQL-学习数据库必备的基础知识
  17. SSM实训:11、页面插件集成
  18. 兔老大的系统设计(一)健康度系统
  19. 苹果手机fiddler代理后无法联网的问题
  20. Pycharm实现645协议解析器(一)

热门文章

  1. python怎么读excel_python怎么读写excel
  2. 云e办(后端)——员工管理
  3. infineon 高边芯片 BTS54040-LBF
  4. 利用PHP制作简单的内容采集器
  5. OSChina 周一乱弹 —— 世界很大,生活很咸
  6. Exceptional C++ 读书笔记
  7. 【web3】geth使用笔记(二)——智能合约DEV环境搭建
  8. costmap代价地图
  9. 微软宣布在中英文机器翻译方面取得重大突破
  10. 社交机器人检测:Detect Me If You Can: Spam Bot Detection Using InductiveRepresentation Learning--论文阅读