彩色图片转手绘线稿的原理简述与Python实现 | 您所在的位置:网站首页 › 如何图片变线稿图 › 彩色图片转手绘线稿的原理简述与Python实现 |
大家好,我是小小明,在学习 好友叶庭云 介绍的一门中国大学MOOC的课程中,学到手绘图像,下面我测试并总结一下。 课程链接是:https://www.icourse163.org/course/BIT-1001870002?from=searchPage 下面使用Python Imaging Library ( PIL ) 进行图像处理,安装方式: pip install pillow 彩色图片转手绘线稿的原理简述对于一张手绘图,其特征主要是边界线条较重、相同或相近色彩趋于白色、略有光源效果。 将彩色图片转换为手绘线稿,首先需要将图片转换为灰度图片。 灰度值实际代表了图像明暗的变化,而梯度代表了灰度的变化率。 调整像素的梯度值可以间接改变图像的明暗程度。 下面以如下图片为例进行测试: from PIL import Image import numpy as np im = Image.open('001.jpg') im转换为灰度模式: im = im.convert("L") im获取灰度图片像素点数据的numpy数组: data = np.array(im) data.shape, data.dtype ((300, 300), dtype('uint8')) 调整像素的梯度值调整像素的梯度值间接改变图像的明暗程度 首先提取出x和y方向的梯度: grad_x, grad_y = np.gradient(data) print(grad_x.shape, grad_y.shape) (300, 300) (300, 300)深度值的取值范围为0-100,决定了梯度的缩放比例,现在预设深度值为10: depth = 10 grad_x /= 100/depth grad_y /= 100/depth 光源效果根据灰度变化来模拟人类视觉的远近程度 设计一个位于图像斜上方的虚拟光源光源相对于图像的俯视角为 eLevation,方位角为 Azimuth建立光源对个点梯度值的影响函数运算出各点的新像素值
假设俯视角eLevation= π 2.2 \frac \pi {2.2} 2.2π,方位角Azimuth= π 4 \frac \pi {4} 4π: eLevation = np.pi / 2.2 azimuth = np.pi / 4 # 光源对x/y/z轴三个方向的影响程度 dx = np.cos(eLevation) * np.cos(azimuth) dy = np.cos(eLevation) * np.sin(azimuth) dz = np.sin(eLevation) 梯度归一化构造x和y轴梯度的三维归一化单位坐标系: A = np.sqrt(grad_x ** 2 + grad_y ** 2 + 1.) uni_x = grad_x / A uni_y = grad_y / A uni_z = 1. / A梯度与光源相互作用,将梯度转化为灰度: b = 255 * (dx * uni_x + dy * uni_y + dz * uni_z)最终看看转换效果: Image.fromarray(b.clip(0, 255).astype('uint8')) |
CopyRight 2018-2019 实验室设备网 版权所有 |