利用RGB空间几何生成数字绘景灯光效果
结果
swipe_across_verticallyn_gif_011
No data available. Please select runs that logged the key move_circle_gif_013.
引言

在数字绘景中,灯光起着重要作用。不同于现实中和渲染场景中的真实光照,数字绘景中所绘制的灯光效果是由艺术家用不均匀的笔触制作的。在这篇论文 "Generating Digital Painting Lighting Effects via RGB-space Geometry" (中文译为《利用RGB空间几何生成数字绘景灯光效果》),作者提出了一个图像处理算法,能够在单张图像上生成数字绘景灯光效果。该算法基于以下主要观察结果:艺术家在绘制灯光效果时使用很多叠加笔触,也就是说,哪些像素有浓密的笔触历史,就会获得更多的光照笔触。基于这一观察结果,他们提出了一个算法,能够:
- 根据输入图像本身的色彩几何,估算图像的笔触密度。
- 模拟艺术家从粗到精的工作流程,生成逼真的灯光效果。
那篇论文→
作者就该论文发布了一个视频,视频中概述了这一算法。
论文概要
所提出的算法就是一步一步地模拟艺术家的灯光效果合成流程。在现今的艺术创作流程中,艺术家手动绘制灯光效果,并接连不断地修改以找到最佳作品。为了制作出可用的灯光效果作品,艺术家往往先绘制一些全局的或粗略的光照层,然后再对这些图层润饰细节,以便于符合原始图像内容。该流程的缺陷:
-
耗费大量时间;
-
耗费大量工作。
该算法基于一个关键假设:艺术家绘制的新笔触与之前的笔触历史有关。但大部分数字绘景没有这种笔触历史信息。更何况,由于图像分辨率高,记录这种信息是不现实的。
提出方法
-
我们直接估算笔触历史密度。我们的方法就是,首先从输入图像提取一个虚拟调色板,然后利用像素颜色与调色板颜色之间的关系来估算笔触历史。这个步骤只能用于单个成品插图/图像。
-
然后我们模拟艺术家的工作流程,从粗到精添加灯光效果。
- 首先,我们生成一张粗略效果图。这张图粗略地、低分辨率地渲染出高亮、阴影以及附近物体之间造成的颜色变化。
- 然后对粗略效果图做精细化处理,以符合原始图像结构,从而生成美观的灯光效果。
关键点
该论文的关键点:
- 那个算法一次只能处理一张图像并完成以上流程。
- 这种灯光效果可用于照片、三维渲染图像。
- 生成效果需要约0.06秒。
- 那个算法支持多光源。 *那个算法适用于真实场景/图像,以及数字绘制的插图。
代码
我们亲自尝试制作一些有趣的灯光效果。
代码→
- 打开
anaconda
命令窗口,然后新建一个conda环境。
conda create --name paintlight
pip install https://github.com/ayulockin/PaintingLight
- 依照仓库中的自述文件安装依赖包。在新建的环境中一定要用python 3.6.x版本。如果你不是,就输入如下:
conda install python=3.6.10
- 进入
code
所在路径。现在你就可以侍弄那些例子了,还可以用自己的图像看看效果。
cd code
python example001.jpeg
在我的原始仓库分支,你需要登录wandb.com,这样你就能利用权阈指示板把结果可视化为更强的交互式。
即便你用的是原始仓库,也可以按照自述文件及这里的步骤。这样会生成一个带图像的cv2.window
。你可以把鼠标放到上面查看灯光效果。但如果要保存效果,你需要把输出结果记录到权阈。
结果
精选结果
调节参数
为了用自己的图像做出惊艳的灯光效果,你可以用——
python default.py path_to_image
你还可以调节参数值来制作想要的灯光效果。那个仓库的自述文件列出了全部参数及其参考值。我试验了几个参数,修改参数范围,从最小值到最大值,同时保持x
值和y
值不变。
-
light_source_height
:这是光源到图像的距离。参考值为1。为了看看这个参数的作用,我使这个值在(0.1,2)
范围变动,步长为0.1。结果见下图light_height_source_gif_015
。观察到,光源越远黑暗区域越小。 -
light_intensity
:这是光照强度。参考值为0.85。为了看看这个参数的作用,我使这个值在(0,1)
范围变动,步长为0.1。结果见下图light_intenity_gif_008
。 -
ambient_intensity
:这是环境光照强度。参考值为0.45。为了看看这个参数的作用,我使这个值在(0,0.7)
范围变动,步长为0.1。结果见下图ambient_intensity_source_gif_018
。
我建议大家侍弄一下这些值,以便于生成绚丽夺目的图像。
代码→
结论与最后一个花招
遮住部分区域
论文教给大家如何遮住部分图像、只把灯光效果应用到想要的区域。为了做到这一点,你可以制作一个二元掩膜并传递给那个算法。我们已经将作者提供的例子可视化,如下图。观察一下长颈鹿只有横向灯光效果的结果。
结论
这是个令人激动的项目。该项目仍处于研究阶段,那些作者正研发Photoshop插件,以促进广泛使用。我希望大家喜欢这些视觉作品,也希望这能激励大家亲自试用那个仓库。即便在如今的深度学习时代,也特别令人激动,传统的图像处理算法有时也能生成叹为观止的结果。如有任何观点和意见,请随时在Twitter联系我. @ayushthakur0。