在观看博客正文前,读者首先需要具备简单的Python知识和一些Numpy库的基本操作。下面请跟随笔者的脚步走进本次的实例教程——图像的手绘风格绘制!
设计思路:- 灵活运用自身所学的Numpy知识;学会Numpy和PIL库的搭配使用;使用Numpy库将图片转换为数组表示形式;结合Numpy和PIL库提取图像特征形成手绘效果。
- 将图像转换为有规则的二维数组;将图像进行转换后,利用Numpy中的方法访问图像上的任意像素值;将图像用灰度色彩表示,并对图像进行灰度变换,主要有:反变换、区间变换、像素平方处理;对图像进行计算梯度、梯度归一化、虚拟光源、重构图像等操作;图像手绘效果呈现。
对图像进行简单操作:
- 打开图片,查看图片的属性值;通过改变RGB值,实现图片的简单变换,主要操作有:反变换、区间变换、像素平方处理;
# -*- coding: utf-8 -*-
# @Time :2022/3/19 11:39
# @Author : 搬砖与板砖
# @File :Hand_painted.py
from PIL import Image
import numpy as np
im = np.array(Image.open("d:/1.jpg").convert('L'))
print(im.shape, im.dtype)
# 对图像进行简单转换
im1 = 255-im
im2 = (100/255)*im+150
im3 = 255*(im1/255)**2
pil_im = Image.fromarray(np.uint(im3))
pil_im.show()
- 操作结果如图:
对图像进行计算梯度、梯度归一化、虚拟光源、重构图像、输出图片操作:
- 颜色只有黑白两种(转灰度图,像素点表示灰度值);勾勒轮廓,边界线条较重(计算梯度,梯度大的像素点分配更大的灰度值);相同或相近的色彩趋于白色(计算梯度,相同或相近的色彩的灰度图的梯度值接近于0);略有光源效果(在梯度分量上乘上光源影响因子在该方向上的投影)。
# -*- coding: utf-8 -*-
# @Time :2022/3/19 11:39
# @Author : 搬砖与板砖
# @File :Hand_painted.py
from PIL import Image
import numpy as np
a = np.asarray(Image.open("D:/1.jpg").convert('L')).astype('float') # 获取灰度图的像素矩阵
depth = 10. # 立体化,深度值,取值(0-100)
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 # x,y,z表示图像平面的单位法向量在三个轴上的投影
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) # 光源对x轴的影响因子
dy = np.cos(vec_el) * np.sin(vec_az) # 光源对y轴的影响因子
dz = np.sin(vec_el) # 光源对z轴的影响因子
b = 255 * (dx * uni_x + dy * uni_y + dz * uni_z) # 将各方向的梯度分别乘上虚拟光源对各方向的影响因子,将梯度还原成灰度
b = b.clip(0, 255) # 舍弃溢出的灰度值
hm = Image.fromarray(b.astype('uint8'))
hm.save('D:\2.jpg')
- 操作结果如图:
如有任何问题皆可留言,共同商讨一同进步。
您的支持是笔者前进的动力,感谢观看!



