这样一个问题的来源,是我在思考怎样把一张二次元的彩色图片转化为一张黑白的纯线稿图时遇到并需要解决的难关,这个问题听起来似乎并没有那么难,可实际上却超出我的想象,目前整个解决方案也只是停留在思路阶段,下面主要整理这几天的思路作为学习笔记,方便之后完善代码。
解决该问题初步的步骤如下:
1.将图片黑白化,二值化
2.修复二值化后的白色和黑色杂质,去除大块黑色
3.搜索出整个线稿的路径(难点)
4.将路径的点连接的线段变成顺滑曲线(难点)
5.将曲线加粗
各步骤详细分析:
1.对于这种动漫图片来说可用公式
gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)
加权平均求出各点的灰度值(系数怎样确定暂且不讨论,我只是百度搬运工),然后使其R,G,B值都为此值
黑白化完毕。
然后规定一个阈值比如120,使大于此值的像素值变为255,小于此值变为0。
关于此阈值的选取方法,可多次改变阈值之后分析得到的图片,这里引入一个新概念叫连通分量,我们假设每个黑色像素都是一个结点,相邻的两个黑色像素之间有一条边连接,整张图片就可以就可以看成有许多连通分量的图,当我们取的阈值不合适时,就会导致连通分量特别大,原因见下图:
蓝圈处由于原图该处是渐变的颜色效果,就会导致出现黑白交错的块,零零碎碎的,所以我们只要改变阈值排除过大的连通分量即可。
二值化完毕。
2.修复小杂质我的思路是当那一块像素数量少于某个阈值时就整个抹去,对于大块黑暗,比如上图就有这样的大片黑暗,但是我们这次不能规定新的阈值使大于它的时候抹去这种大黑块了,因为这些黑块可能连着整个线稿,面临损失信息的风险,我的思路是,在图中找黑点,这些黑点满足条件:以该点为圆心,R为半径做圆,该圆内所有点皆为黑色,那我们就可以把这个圆清空。其中R为图中的线稿的粗细,这样,当黑块清理到边界时,就会留下边界了,刚好是我们想要的效果。
3.
(不想写了想看动漫下次再更新)