Python实现图片手绘效果
时间:2022-07-23
本文章向大家介绍Python实现图片手绘效果,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
图片手绘
概述
在家闲来无事看了会MOOC上的数据分析相关视频,以下部分内容来自于北京理工大学MOOC上的《Python数据分析与展示》。
项目综述
其实就是利用numpy对图片进行操作。借助PIL读入图片,利用numpy对图片进行一系列操作,接着把结果存储到本地。
代码的核心思想为:利用像素之间的梯度值对图像重构,根据灰度变化来模拟人类视觉明暗程度。
效果展示
原图
手绘效果图
部分代码
from PIL import Image
import numpy as np
a = np.asarray(Image.open("D://python_pycharm//MyPy//IMG_20191020_152247R.jpg").convert('L')).astype('float')
depth = 10
# 获取图片的像素梯度
grad = np.gradient(a)
# 获取图片像素x、y方向的梯度(像素值差),明暗相近的地方梯度值会很小,
# 明暗相差大的地方梯度值会很大。
grad_x, grad_y = grad
# 根据虚拟深度值来对x、y方向的梯度值进行归一化
grad_x = grad_x * depth / 100
grad_y = grad_y * depth / 100
# 计算像素间x、y方向的梯度值,并进行合并计算,再重新获得x、y方向的梯度值
a = np.sqrt(grad_x ** 2 + grad_y ** 2 + 1.)
uni_x = grad_x / a
uni_y = grad_y / a
uni_z = 1. / a
# 光源设计,即模拟自然光源,示意图见图四,设立一个位于图像斜上方的光源,
# 官员相对于图像的俯视角为elevation,方位角为azimuth
vec_el = np.pi / 2.2 # 82度
vec_az = np.pi / 4. # 45度
# 建立光源对个点梯度值的影响函数
dx = np.cos(vec_el) * np.cos(vec_az)
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)
# 剔除0<n<255区间之外的值
b = b.clip(0, 255)
# 根据数组生成图片
im = Image.fromarray(b.astype('uint8'))
im.save('D://python_pycharm//MyPy//IMG_20191020_152247R1.jpg')
- Log4Net使用心得
- nginx通过https方式反向代理多实例tomcat
- Linux系统下yum镜像源环境部署记录
- 特斯拉vs凯迪拉克vs奔驰:三大汽车自动驾驶系统比拼
- Centos下添加静态路由(临时和永久有效)的操作记录
- python如何保证输入键入数字
- 微信小程序自定义数据分析试水
- 挂载银行前置机Ukey到windows server2012虚拟机的操作记录
- 文件上传速度查询方法
- “AS3.0高级动画编程”学习:第三章等角投影(上)
- su: 无法设置用户ID: 资源暂时不可用
- NumPY学习笔记
- LVS负载均衡下session共享的实现方式-持久化连接
- Centos6.9下RabbitMQ集群部署记录
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- R语言实现生物序列的降维比对
- Tomcat NIO(9)-IO线程-Overall流程和关键类
- 有限元平面四边形等差单元python编程
- 动图演示:手撸堆栈的两种实现方法!
- [Go] 实战项目在线客服GO-FLY -在gin框架使用IP识别库转换IP为城市
- leetcode1552题解【二分+贪心】
- 这三年被分布式坑惨了,曝光十大坑
- 为什么删数据也提示空间不足呢?
- 前端踩坑系列《六》——让人又爱又恨的npm包
- docker运行Tomcat后访问首页报404(详细永久解决步骤)
- vue.js如何快速入门第1篇
- 3.列表-HTML基础
- 启动时间的一些分析
- 1.HTML基础知识-HTML进阶
- 浅析一个postgresql的死锁问题