如何以编程方式对图像进行卡通?

问题描述 投票:62回答:8

我的应用程序使用人们的照片和视频,我想要卡通。所以我需要一个算法来手动完成(我们的产品使用c ++ / Qt,它有图像处理类)或者也许是一些CLI程序,我可以在我自己的应用程序中调用和使用它。

algorithm image-manipulation command-line-interface
8个回答
47
投票

以下是一些可以使用的算法:

  • 中位数或重复框模糊滤镜以获得卡通色调 编辑:双边过滤应该更好地满足您的需求
  • 最小滤镜(第0百分位数)可增强某些类型的边缘
  • 使用RGB颜色立方体中的小子立方体或球体进行彩色图像分割
  • 使用边缘检测(例如Sobel内核或8向边缘跟踪)对分割图像进行通用边缘增强
  • 具有增强边缘的复合模糊/中值滤波图像

这些都是相当基础的,并且都非常容易实现。请记住,中值和盒子模糊滤镜可以用线性时间复杂度w.r.t实现。内核半径。

更多编辑:

一旦你了解了Huang的算法,实现盒式模糊滤镜就是一块美味的蛋糕。

阅读材料:

  • Fast Median and Bilateral Filtering(获取PDF)
  • Median Filtering Constant time(获得PDF)注意:我在C#中使用Mono / SIMD实现了这一功能,以加速直方图合并,但是当直径超过~60像素时,由于可比较的数量,它似乎只比O(r)算法更好。添加/子指令(收支平衡点),C ++实现可能更适合利用SIMD。

其他阅读材料包括用于分割和边缘追踪的Gonzalez & Woods' Digital Image Processing(似乎是旧版本)。 8向边缘跟踪可能非常难以弯曲(在像素上或像素间边缘之间进行选择以及如何锁定边缘)。我很乐意分享一些代码,但是百行不完全适合这里。


22
投票

您可以尝试旋转镜检查,就像toonyphotos.com一样:


12
投票

您可能想查看Freestyle,一个开源(Google Summer of Code,甚至)项目,为non-photorealistic renderer实现Blender。以下是卡通模式的输出示例:alt text (来源:sourceforge.net


7
投票

如果在the GIMP的卡通滤镜(或其他一些滤镜组合)中有一些参数可以达到预期的效果,那么它可以在batch processing mode中运行。


6
投票

我自己没有这样做,但想到两个步骤可能会给图像带来卡通效果。

  1. 检测边缘,并在这些边缘上绘制相当粗的线(几个像素)。
  2. 减少图像中的颜色数量。

5
投票

不确定这是否会有所帮助,但this tutorial for Photoshop建议执行以下操作:

  1. 在Photoshop中打开图像
  2. 滤镜>模糊>高斯模糊。将半径设置为3.0或更高,以品尝。
  3. 编辑>淡化高斯模糊。将弹出一个窗口。 。 。将模式设置为变暗。您可能还需要降低不透明度。

这是结果。

我想你可以在你的程序中做类似的事情。


3
投票

这样做比较容易。以下是步骤:

  • 双边过滤以简化/抽象照片。您可能希望将双边滤波器分开,以使其更快。沿着梯度在1d中执行双边滤波,然后沿着法线到梯度。
  • 检测边缘。例如,使用高斯差异算法。您可能希望在梯度方向上使用DoG并沿流线平滑它。要获得流线,您需要获得可以通过结构张量获得的边缘切线流量(ETF)。
  • 量化颜色。实际上,您量化亮度以模拟cel着色也称为toon着色。
  • 通过量化和检测到的边缘混合抽象图像。

这将为您提供一个看起来像cel阴影卡通的渲染图像。

我制作了一些免费软件(对于win64),它在以下网址完成:http://3dstereophoto.blogspot.com/p/painting-software.html

该软件的名称是“漫画家”,你可以在这里看到它:http://3dstereophoto.blogspot.com/2018/07/non-photorealistic-rendering-software_9.html

这些是我的博客的链接,主要涉及3D摄影(深度图,摄影测量等)。


1
投票

实际上我不知道一个工具,但你可以看看osg(openSceneGraph)

有一个osgFX库,有卡通效果......也许你可以从那个图书馆激发...


也许(我不知道)imagemagick有很多功能,也许它有这样的功能,但我不知道...

© www.soinside.com 2019 - 2024. All rights reserved.