先来预览一下效果↓ ↓ ↓
在写代码前先介绍几个概念,理解了这几个概念才能更好的理解代码
1.图像深度值:
图像深度是指存储每个像素所用的位数,也用于量度图像的色彩分辨率。
2.图像梯度:
梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。
图像梯度可以把图像看成二维离散函数,
图像梯度其实就是这个二维离散函数的求导:
G(x,y) = dx(i,j) + dy(i,j);
dx(i,j) = I(i+1,j) - I(i,j);
dy(i,j) = I(i,j+1) - I(i,j);
其中,I是图像像素的值(如:RGB值),(i,j)为像素的坐标。
图像梯度一般也可以用中值差分:
dx(i,j) = [I(i+1,j) - I(i-1,j)]/2;
dy(i,j) = [I(i,j+1) - I(i,j-1)]/2;
图像边缘一般都是通过对图像进行梯度运算来实现的。
3.灰度:
灰度使用黑色调表示物体,即用黑色为基准色,不同的饱和度的黑色来显示图像。 每个灰度对象都具有从 0%(白色)到100%(黑色)的亮度值。
图像的手绘效果实现
1、手绘效果的几个特征:
- 黑白灰色
- 边界线条较重
- 相同或相近色彩趋于白色
- 略有光源效果
2、利用像素之间的梯度值和虚拟深度值对图像进行重构,根据灰度变化来模拟人类视觉的远近程度
3、考虑光源效果,根据灰度变化来模拟人类视觉的远近程度
- 设计一个位于图像斜上方的虚拟光源
- 光源相对于图像的俯视角为Elevation,方位角为Azimuth
- 建立光源对个点梯度值的影响函数
- 运算出各点的新像素值
编写代码
代码:
from PIL import Image
import numpy as np
a = np.asarray(Image.open('ha.png').convert(