Numpy实现图像变换

实现:图像—————>多维数组————————>变换后的图像

代码:


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")    # 保存新的图像

效果:

  • ps:依次是原图,bcd对应的变换

升级版:达到手绘图片

代码:


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')  # 生成图像

效果:

posted @ 2021-01-23 21:39  Frommoon  阅读(290)  评论(0编辑  收藏  举报