读取图像+简单处理
import numpy as np
from PIL import Image
path = "" #图像路径
im = np.array(Image.open(path+"img.png"))
print(im.shape,im.dtype)
b = [255,255,255] - im #取像素互补值
im = Image.fromarray(b.astype('uint8'))
im.save(path+"test1.png")
b = np.array(Image.open(path+"img.png").convert('L')) #取灰度值
a = 255 - b #灰度值互补值
im = Image.fromarray(a.astype('uint8'))
im.save(path+"test2.png")
c = (100/255)*b + 150 #将原值压缩到一定范围中
im = Image.fromarray(c.astype('uint8'))
im.save(path+"test3.png")
d = 255*(b/255)**2 #将原值压缩到一定范围中
im = Image.fromarray(d.astype('uint8'))
im.save(path+"test4.png")
效果:

图像的手绘效果实现
手绘效果的几个特征:
- 黑白灰色
- 边界线条较重
- 相同或相近色彩趋于白色
- 略有光源效果
实现思路:
- 事实上,手绘风格是在对图像进行灰度化的基础上,由立体效果和明暗效果叠加而成的。
- 灰度代表着图像的明暗变化,梯度值表示的是灰度的变化率,所以我们可以通过调整像素的梯度值来间接改进图像的明暗程度
- 立体效果通过添加虚拟深度值来实现
所以解决方案为:利用像素之间的梯度值和虚拟深度值对图像进行重构,根据灰度变化来模拟人类视觉的明暗程度
from PIL import Image
import numpy as np
path = "" #图像路径
a = np.asarray(Image.open(path+'img.png').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(path + 'draw.png')
原图:

生成图像:

1208



被折叠的 条评论
为什么被折叠?



