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')
- Linux上安装Redis
- SpringBoot+WebSocket实现在线聊天(二)
- SpringBoot中使用Freemarker构建邮件模板
- SpringBoot中发送QQ邮件
- SpringBoot中使用POI,快速实现Excel导入导出
- 代理技术 | 重磅,代理服务器背后的故事(正向、反向代理)
- SpringBoot中自定义参数绑定
- ElementUI中tree控件踩坑记
- 一个隐马尔科夫模型的应用实例:中文分词
- 使用MyBatis轻松实现递归查询与存储过程调用
- Config Server——使用Spring Cloud Bus自动刷新配置
- Config Server——配置内容的加密与解密 详解
- 使用 HTML5 WebSocket 构建实时 Web 应用
- Mysql group by实现方式(一) - 临时表
- 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 数组属性和方法
- 使用深度学习和OpenCV的早期火灾检测系统
- 【时序预测】一文梳理时间序列预测——ARMA模型
- 三分钟Kubernetes-环境搭建篇
- Linux分区页框分配器之水位
- 使用GPU训练模型
- Spring事务源码分析专题(一)JdbcTemplate使用及源码分析
- TensorFlow处理运动想象分类任务
- 使用kepler.gl可视化地理空间数据
- 聊聊 Python 代码覆盖率工具 - Coverage
- 目标检测模型YOLO-V1损失函数详解
- 轻松学Pytorch-使用ResNet50实现图像分类
- IDEA奇淫小技巧
- [PHP框架] ThinkPHP6 介绍、安装及配置
- 【翻译】withoutboats 的 io-uring 笔记
- [Python]随机生成大量的虚拟信息测试数据(姓名,手机号,ID,家庭住址等)