Python数据分析与展示-图像的手绘效果

图像数组表示和PIL库

图像一般使用RGB色彩模式,即每个像素点的颜色由红®、绿(G)、蓝(B)组成,RGB三个颜色通道的变化和叠加得到各种颜色,其中R、G、B的取值范围都是0‐255,RGB形成的颜色包括了人类视力所能感知的所有颜色。
图像是一个由像素组成的二维矩阵,每个元素是一个RGB值,或者说图像是一个三维数组,维度分别是高度、宽度和像素RGB值。
PIL库是一个具有强大图像处理能力的第三方库。
在命令行下的安装方法:

pip install pillow

导入PIL库中代表一个图像的类(对象)

from PIL import Image

图像的变换

包括导入图像、图像操作、结果保存,可以利用PIL库的open(dir)、save()函数实现导入和保存操作。

图像手绘效果实例

手绘效果的几个特征:图像中只有黑白灰色、边界线条较重、相同或相近色彩趋于白色、略有光源效果。
想要实现手绘效果主要步骤包括:梯度重构、梯度归一化、光源模拟、图像生成。

梯度重构

利用像素之间的梯度值和虚拟深度值对图像进行重构根据灰度变化来模拟人类视觉的远近程度。这时候就要用到numpy中的梯度函数。

depth = 10
grad = np.gradient(a)
grad_x, grad_y = grad
grad_x = grad_x * depth / 100
grad_y = grad_y * depth / 100

梯度归一化

构造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

光源效果

据灰度变化来模拟人类视觉的远近程度
设计一个位于图像斜上方的虚拟光源,光源相对于图像的俯视角为Elevation,方位角为Azimuth,建立光源对个点梯度值的影响函数,运算出各点的新像素值。
在这里插入图片描述

vec_el = np.pi / 2.2
vec_az = np.pi / 4
dx = np.cos(vec_el) * np.cos(vec_az)
dy = np.cos(vec_el) * np.sin(vec_az)
dz = np.sin(vec_el)

完整:

from PIL import Image
import numpy as np
a = np.asarray(Image.open('D:\CSDN\手绘\光源.jpg').convert('L')).astype('float')

depth = 10
grad = np.gradient(a)
grad_x, grad_y = grad
grad_x = grad_x * depth / 100
grad_y = grad_y * depth / 100

A = np.sqrt(grad_x**2 + grad_y**2 + 1)
uni_x = grad_x / A
uni_y = grad_y / A
uni_z = 1 / A

vec_el = np.pi / 2.2
vec_az = np.pi / 4
dx = np.cos(vec_el) * np.cos(vec_az)
dy = np.cos(vec_el) * np.sin(vec_az)
dz = np.sin(vec_el)

b = 255 * (dx * uni_x + dy * uni_y + dz * uni_z)
#为避免数据越界,将生成的灰度值裁剪至0‐255区间
b = b.clip(0, 255)

im = Image.fromarray(b.astype('uint8'))
im.save('D:\CSDN\手绘\shouhui.jpg')

结果
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值