实现:图像—————>多维数组————————>变换后的图像
代码:
import numpy as np
from PIL import Image
# 变换图像:一·读入图像。二·修改RGB值。三·保存为新的文件
a = np.array(Image.open("C:/Users/dell/Desktop/image/洪崖洞.jpg").convert('L')) # 把文件中的jpg变换为一个三维数组(数组含三个参数,分别为
# 高度,宽度,每个像素的RGB值 ),convert:把彩色图片变灰白(变成二维数组,对于灰度值)
# b = 255-a # 取反变换
c = (100/255)*a+150 # 区间变换
# d = 255*(a/255)**2 # 像素平方
im = Image.fromarray(c.astype('uint8')) # 生产新的图像对象im
im.save("C:/Users/dell/Desktop/image/洪崖洞2.jpg") # 保存新的图像
效果:
升级版:达到手绘图片
代码:
from PIL import Image
import numpy as np
a = np.asarray(Image.open('C:/Users/dell/Desktop/image/洪崖洞.jpg').convert('L')).astype('float')
depth = 10 # 预设深度值 0-100
grad = np.gradient(a) # 取图像灰度的梯度值
grad_x, grad_y = grad # 分别取横纵图像的梯度值
grad_x = grad_x * depth / 100 # 根据深度调整x和y方向的梯度值
grad_y = grad_y * depth / 100
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
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)
dz = np.sin(vec_el)
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('C:/Users/dell/Desktop/image/洪崖洞4.jpg') # 生成图像
效果: