67

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

4

8 回答 8

47

这里有一些算法可以玩:

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

这些都是相当基本的,而且都很容易实现。请记住,中值和框模糊过滤器可以使用内核半径的线性时间复杂度来实现。

更多编辑:

一旦你了解了 Huang 的算法,实现一个盒子模糊过滤器就是小菜一碟。

阅读材料:

  • 快速中值和双边滤波(获取 PDF)
  • 中值滤波常数时间(获取 PDF)注意:我在 C# 中使用 Mono/SIMD 来加速直方图合并,但是当直径超过 ~60 像素时,它似乎比O ( r ) 算法更好,因为相当数量的添加/子指令(盈亏平衡点),C++ 实现可能更适合利用 SIMD。

其他阅读材料包括Gonzalez & Woods 的用于分割和边缘跟踪的数字图像处理(似乎是旧版本)。8 向边缘追踪真的很难弯下腰(在像素上或像素间边缘之间进行选择,以及如何锁定边缘)。我很乐意分享一些代码,但一百行并不完全适合这里。

于 2009-08-31T13:39:31.287 回答
22

您可以尝试旋转镜检查,就像toonyphotos.com所做的那样:

旋转检查示例

于 2009-08-31T13:32:20.097 回答
12

您可能想查看Freestyle,这是一个开源项目(甚至是 Google Summer of Code),用于为Blender实现非真实感渲染器。这是它的输出示例,在卡通模式下:( 来源:sourceforge.net替代文字

于 2009-08-31T14:31:24.210 回答
8

如果在GIMP的卡通滤镜(或其他滤镜组合)中有一些参数可以达到预期的效果,它可以在批处理模式下运行

于 2009-08-31T14:09:46.990 回答
6

我自己还没有这样做,但考虑了两个可能使图像具有卡通外观的步骤。

  1. 检测边缘,并在这些边缘上画一条相当粗的线(几个像素)。

  2. 减少图像中的颜色数量。

于 2009-08-31T13:18:11.253 回答
5

不确定这是否会有所帮助,但本 Photoshop 教程建议执行以下操作:

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

这是结果。

在此处输入图像描述

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

于 2009-08-31T13:22:05.817 回答
4

这相对容易做到。以下是步骤:

  • 双边过滤以简化/抽象照片。您可能想要分离双边过滤器以使其更快。沿着梯度在 1d 中执行双边滤波器,然后沿着梯度的法线执行。

  • 检测边缘。例如,使用高斯差分算法。您可能希望在渐变方向上使用 DoG 并按照流线对其进行平滑处理。要获得流线,您需要获得可以通过结构张量获得的 Edge Tangent Flow (ETF)。

  • 量化颜色。实际上,您可以量化亮度以模拟 cel 着色(也称为卡通着色)。

  • 混合量化后的抽象图像和您检测到的边缘。

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

我制作了一些免费软件(适用于 win64),网址为:http: //3dstereophoto.blogspot.com/p/painting-software.html

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

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

于 2018-07-10T14:50:10.683 回答
1

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

有一个 osgFX 库,还有卡通效果……也许你可以从那个库中得到启发……


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

于 2009-08-31T13:15:59.913 回答