一,借鉴:
本文借鉴了CSDN博主风吹夏天对此论文算法的理解:风吹夏天的图像铅笔画算法,以及香港中文大学Cewu Lu等人写的该论文的主页。原文作者和博主风吹夏天都给过代码,但是代码不全。我仔细看了原论文和该博主的文章后,基本上,大致算法思想就理通了。本文对于具体算法细节就不细述了,个人建议还是先进行原论文的研读,对该论文所进行的步骤先有个大致的了解。
二,算法思路
1,首先需要产生笔画结构
大致思路:对原图像进行梯度运算,得出大致轮廓 -----> 设计8个方向的卷积核,并依据论文中的公式对像素依据最大值所在子图像进行方向分类 -----> 再依据论文中的公式对每个方向的像素分别和对应的卷积核进行卷积
几个注意的地方:
对于卷积核的大小,论文中写的是原图片高和宽的三十分之一,论文作者设计卷积核的目的是希望产生铅笔画中一笔一笔勾画出的痕迹,但如果太大,会导致轮廓图不清晰,卷积核大小应该设置在3~13间效果好些;
根据输入图片的差异,原图片可能需要去噪,若最后轮廓不清晰,可能需要直方图均衡化使轮廓相对清晰。
2,其次产生色调图
论文作者根据对大量铅笔图片的研究,发现它们的直方图如下,而我们要做的就是将原图片的色阶的直方图转换为以下的直方图,而以下的直方图可以由高斯分布函数,均匀分布函数和拉布拉斯分布函数带权值相加后近似得到(三个权值相加为1),它们的权值比为w1:w2:w3,此后,进行SML映射将原图片的直方图转换为以下的直方图就可以了。
注意的地方:一般采用w1:w2:w3 = 2:22:76,因为铅笔画较谈,w3越大,图片越亮,但对于有些图片,如果太亮,有些较暗的细节就会消失,此时可以选择w1:w2:w3 = 11:37:52,此外也可以根据最后效果调整三个参数大小,一般,w3介于52~76间,w1最好在10以下。
3,由铅笔画背景和色调图生成色调渲染图
我使用的是如下的铅笔背景图:
这一步主要是为了解下面这个方程组中的β矩阵,其中H(x)为上面这张铅笔背景图,J(x)为第二步生成的色调图,现在主要求解β(x),最后色调渲染图T(x) = H(x).^β(x),这样做的目的是使色调图有铅笔反复抹画的痕迹,且保持直方图与铅笔画的直方图一致:
下面是求解公式,风吹夏天博主的文章有详细的求解过程,大致思路是先把图像矩阵变成向量,再进行求解: