Python数据分析与展示:实例:图像的手绘效果

实例:图像的手绘效果

图像的数组表示

图像的RGB色彩模式

RGB三个颜色通道的变化和叠加得到各种颜色,其中

  • R红色,取值范围0-255
  • G绿色,取值范围0-255
  • B蓝色,取值范围0-255

RGB形成的颜色包括了人类视力所能感知的所有颜色。


PIL库

PIL,Python Image Library

PIL库是一个具有强大图像处理能力的第三方库。

在命令行下的安装方法:

pip install pillow

Image 是PIL库中代表一个图像的类(对象)

from PIL import Image

图像的数组表示

图像是一个由像素组成的二维矩阵,每个元素是一个RGB值。

Python数据分析与展示:实例:图像的手绘效果_第1张图片

如图所示,图片可以转化为一个由x轴和y轴形成的阵列,其中的每一个像素是一个RGB值,我们知道RGB值中的每一部分都是一个字节,所以一个图像就是由三个字节作为元素形成的一个二维矩阵。

Python数据分析与展示:实例:图像的手绘效果_第2张图片


图像的变换

读入图像后,获得像素RGB值,修改之后保存为新的文件。

Python数据分析与展示:实例:图像的手绘效果_第3张图片


Python数据分析与展示:实例:图像的手绘效果_第4张图片


Python数据分析与展示:实例:图像的手绘效果_第5张图片


Python数据分析与展示:实例:图像的手绘效果_第6张图片


图像的手绘效果

手绘效果的几个特征:

  • 黑白灰色
  • 边界线条较重
  • 相同或相近色彩趋于白色
  • 略有光源效果

手绘效果是在对图像进行灰度化的基础上,由立体效果、明暗效果叠加而成的。灰度表示图像的明暗变化,而梯度值表示了灰度的变化率。所以我们利用像素之间的梯度值和虚拟深度值对图像进行重构,跟据灰度变化来模拟人类视觉的明暗程度

实例代码:

from PIL import Image
import numpy as np

a = np.asarray(Image.open('./beijing.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
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)

im = Image.fromarray(b.astype('uint8')) 	#重构图像
im.save('./beijingHD.jpg')

Python数据分析与展示:实例:图像的手绘效果_第7张图片


代码解析:

depth = 10. 						# 预设深度值为10,取值范围0-100
grad = np.gradient(a)				
grad_x, grad_y = grad 				# 提取x和y方向的梯度值
grad_x = grad_x*depth/100.         
grad_y = grad_y*depth/100.          # 跟据深度调整x和y方向的梯度值

Python数据分析与展示:实例:图像的手绘效果_第8张图片

vec_el = np.pi/2.2 					#np.cos(vec_el)为单位光线在地平面上的投影长度
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 轴的影响
A = np.sqrt(grad_x**2 + grad_y**2 + 1.)   #构造x轴和y轴梯度的三维归一化单位坐标体系
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)  #梯度与光源相互作用,将梯度转化为灰度
b = b.clip(0,255)                         #为了避免数据越界,将生成的灰度值裁剪至0-255区间
im = Image.fromarray(b.astype('uint8')) 	
im.save('./beijingHD.jpg')                #生成图像

#所有视频截图均来自中国大学mooc北京理工大学嵩天老师的课程
《Python数据分析与展示》

你可能感兴趣的:(Python数据分析,python,机器学习,人工智能)