生成笔触绘画过程:
Grayscale Guidance
首先调整输入灰度图像的直方图,改善其色调hue;使用CLAHE加强输入图像的对比度
接着对输入图像的灰度量化为${G_1,G_2,…,G_n}$,由此步骤新生成的图像记为$Q$
按行扫描Q,每一行中具有小于等于灰度级G的灰度的像素被视为一个区间,这一区间的开始像素就是未来笔触的开始位置,灰度级G即为这一笔触的central pixel gray value mean;这样就可以把水平方向的笔触画出来了(笔触的宽度W是提前确定的,是一个用户可调节的参数)
利用这种方法,可以通过旋转Q来画出各个方向的笔触
Direction Guidance
观察真实素描画可以看出,笔触的方向通常是沿着边缘的切线的
使用输入图像的梯度信息来做这个笔触方向的预测,因为梯度与边缘通常是紧密联系的。
使用ETF(edge tangent flow)来逐像素地估计笔触的方向。构造ETF的方法:
- 计算每个像素的梯度向量的模和方向
- 将这些向量逆时针旋转90°
- 迭代地调整这些向量的方向,主要目的是让模长较小的向量的方向能够趋向模长较大的向量,即起到一个类似平滑的效果
这样,各向量的方向就近似地与边缘平行了,我们得到了一个这些向量构成的分辨率与原图像相同的向量场。
接下来,将输入图像根据ETF划分为一定的区域。流程:
- 将向量的方向从0到2pi量化到n个值,相位差为pi的两个向量被认为具有同一方向
- 将具有同一方向的向量对应的像素划分到一个区域
分别在每个区域中绘制这一区域对应方向的笔触,就可以得到n个绘制结果,表示为${\beta_1, \beta_2, …, \beta_n}$。下一步就要将它们合并,得到整体的结果。
Area Merging and Detail Enhancement
按笔触方向划分区域并分别进行绘制,会导致分区之间在相加后不能很好地融合到一起,且细小的分区中笔触也会很短小,整体看去就像噪声一样。文章解决这一问题的做法是将笔触的首尾延长2W个像素,W为笔触的宽度。
从分区结果得到最终结果的表达式:
$A=minimum(\beta_1, \beta_2, …, \beta_n)$
延长笔触之后细节的清晰度受到了影响。文章的做法是用线性卷积的方法计算edge map,然后将edge map与A相乘来得到加强细节的结果。
Process Reconstruction
为了生成更真实的绘画过程,作者将每一个笔触按$S$排序,$S$是作者设计的能够近似地表明笔触多大程度上是细节或轮廓的描绘的参数。实际实现中,作者用importance
作为变量名。在生成绘制过程之前,先将所有笔触按$S$从大到小排序,然后按顺序将它们绘制到画布上即可。
$S=(255-G)\times \sum_{i\in D}T_i$
改进尝试
Area Merging
为了解决按方向划分的区域之间不能很好衔接的问题,作者直接将每个笔触延长2W个像素,这样使得结果中细节丢失很严重。作者想通过乘上一个edge map来解决这个问题,但这样并不能弥补高光之类的具有大灰度值的细节丢失。
我将延长笔触的部分改为:
extend_len = stroke_temp['grayscale'] / 255 * period + period
begin -= int(extend_len)
end += int(extend_len)
即深色部分的笔触延长较短长度,浅色部分的笔触延长较长长度。
改进并不明显……(未加edge图)
眼睛的细节看起来保持得稍好一些,主要是像眼白这样小块的浅色区域,没有因为笔触的过分延长而变得太深
对于非真实感渲染的效果改进往往是建立在非常主观的感受之上的。
我希望能找到一个保持高光的改进方法,找不到算了
文档信息
- 本文作者:Jingwen Huang
- 本文链接:https://uangjw.github.io/2021/11/12/paper-sktech-generation/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)