python作业-手绘图像-自定义手绘风

手绘图像的基本思想

  利用像素之间的梯度值(而不是像素本身)重构每个像素值。

  为了体现光照效果,设计一个光源,建立光源对各点梯度值的影响函数(增加一个z 方向梯度值,并给x 和y 方向梯度值赋权值depth。)

  进而运算出新的像素值,从而体现边界点灰度变化,形成手绘效果。

  在利用梯度重构图像时,对应不同梯度取0‐255 之间不同的灰度值,depth 的作用就在于调节这个对应关系。

  利用每个单元的梯度值和方向加权向量合成灰度值,并归一化到0‐255 区间。

  最后从数组中恢复图像并保存。

【实例】自定义手绘风

from PIL import Image
import numpy as np
vec_el = np.pi/2.2 # 光源的俯视角度,弧度值
vec_az = np.pi/4. # 光源的方位角度,弧度值
depth = 10. # (0-100),depth 较小时,背景区域接近白色,画面显示轮廓描绘;depth 较大时,整体画面灰度值较深,近似于浮雕效果
im = Image.open('手绘.jpg').convert('L')
a = np.asarray(im).astype('float')
grad = np.gradient(a) #取图像灰度的梯度值,作为新色彩计算的基础。
grad_x, grad_y = grad #分别取横纵图像梯度值
grad_x = grad_x*depth/100.
grad_y = grad_y*depth/100.
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.)  #A 是梯度幅值,也是梯度大小。
uni_x = grad_x/A   # 各个方向上总梯度除以幅值得到每个像素单元的梯度值         
uni_y = grad_y/A
uni_z = 1./A
a2 = 255*(dx*uni_x + dy*uni_y + dz*uni_z) #光源归一化
a2 = a2.clip(0,255)   #clip 函数用预防溢出
im2 = Image.fromarray(a2.astype('uint8')) #重构图像
im2.save('手绘HandDraw.jpg')

常见问题

  安装报错:Could not find any downloads that satisfy the requirement PIL  (该URL下没有相应下载项)

  解决办法:easy_install Pillow

实例图和效果图如下

posted @ 2020-05-25 21:47  Anjora  阅读(746)  评论(0)    收藏  举报