只需 45 秒,Python 给故宫画一组手绘图!
作者 | 丁彦军
责编 | 屠敏
13日早晨,当北京市民拉开窗帘时发现,窗外雪花纷纷扬扬在空中飘落,而且越下越大,树上、草地、屋顶、道路上,都落满雪花。京城银装素裹,这是今冬以来北京迎来的第二场降雪。
一下雪,北京就变成了北平,故宫就变成了紫禁城。八万张门票在雪花飘下来之前,便早已预订一空。
看着朋友圈、微博好友都在纷纷晒图,作为程序员的我只能坐在办公室里羡慕不已。
不过普通人得去故宫赏雪,程序员可以直接坐在家里动动手指便可以欣赏到故宫的美丽雪景手绘图了。如何操作呢?可通过Python将故宫的建筑物图片,转化为手绘图(素描效果)。效果图如下:
概念与原理
我们都知道手绘图效果的特征主要有:
黑白灰色
边界线条较重
相同或相近色彩趋于白色
略有光源效果
核心原理:利用像素之间的梯度值和虚拟深度值对图像进行重构,根据灰度变化来模拟人类视觉的模拟程度。
把图像看成二维离散函数,灰度梯度其实就是这个二维离散函数的求导,用差分代替微分,求取图像的灰度梯度。常用的一些灰度梯度模板有:Roberts 梯度、Sobel 梯度、Prewitt 梯度、Laplacian 梯度。
以Sobel 梯度计算来解释:
首先计算出 、,然后计算梯度角
梯度方向及图像灰度增大的方向,其中梯度方向的梯度夹角大于平坦区域的梯度夹角。如下图所示,灰度值增加的方向梯度夹角大,此时梯度夹角大的方向为梯度方向。对应在图像中寻找某一点的梯度方向即通过计算该点与其8邻域点的梯度角,梯度角最大即为梯度方向。
图像的数组形式与变换
其中,需要用到的方法:
Image.open( ): 打开图片
np.array( ) : 将图像转化为数组
convert("L"): 将图片转换成二维灰度图片
Image.fromarray( ): 将数组还原成图像uint8格式
代码如下:
from PIL import Imageimport numpy as np
im = Image.open(r"C:\Users\Administrator\Desktop\gugong\微信图片_20190216152248.jpg").convert('L')a=np.asarray(im).astype('float')print(a.shape,a.dtype)(1080, 608) float64#(1080, 608)分别表示高度,宽度
图像的手绘效果处理
实现思路步骤:
1、梯度的重构
numpy的梯度函数np.gradient(a) : 计算数组a中元素的梯度,f为多维时,返回每个维度的梯度。
离散梯度: xy坐标轴连续三个x轴坐标对应的y轴值:a, b, c 其中b的梯度是(c-a)/2
而c的梯度是: (c-b)/1。
当为二维数组时,np.gradient(a) 得出两个数组,第一个数组对应最外层维度的梯度,第二个数组对应第二层维度的梯度。
代码如下:
grad=np.gradient(a)grad_x,grad_y=gradgrad_x = grad_x * depth / 100.#对grad_x值进行归一化grad_y = grad_y * depth / 100.#对grad_y值进行归一化
2、构造guan光源效果
设计一个位于图像斜上方的虚拟光源,光源相对于图像的视角为Elevation,方位角为Azimuth,建立光源对各点梯度值的影响函数,运算出各点的新像素值:
其中:
np.cos(evc.el) : 单位光线在地平面上的投射长度。
dx、dy、dz :光源对xyz三方向的影响程度。
3、梯度归一化
构造x和y轴梯度的三维归一化单位坐标系;
梯度与光源相互作用,将梯度转化为灰度。
4、图像生成
具体详情代码如下:
from PIL import Imageimport numpy as npimport osimport joinimport time
def image(sta,end,depths=10): a = np.asarray(Image.open(sta).convert('L')).astype('float') depth = depths # 深度的取值范围(0-100),标准取10 grad = np.gradient(a) # 取图像灰度的梯度值 grad_x, grad_y = grad # 分别取横纵图像梯度值 grad_x = grad_x * depth / 100.#对grad_x值进行归一化 grad_y = grad_y * depth / 100.#对grad_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 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(end)
def main(): xs=10 start_time = time.clock() startss = os.listdir(r"C:\Users\Administrator\Desktop\gugong") time.sleep(2) for starts in startss: start = ''.join(starts) sta = 'C:/Users/Administrator/Desktop/gugong/' + start end = 'C:/Users/Administrator/Desktop/gugong/' + 'HD_' + start image(sta=sta,end=end,depths=xs)
end_time = time.clock() print('程序运行了 ----' + str(end_time - start_time) + ' 秒') time.sleep(3)
main()程序运行了 ----43.01828205879955 秒 #一共35张图片
最终效果图对比:
最后,你自己动手试试吧?通过此代码为自己画一张手绘图,也可以为自己的家乡或母校画。
作者:丁彦军,一名痴恋于Python的码农
公众号:恋习Python,在这里我们一起用Python做些有意义的事。
参考资料:
http://www.icourse163.org/learn/BIT-1001870002?tid=1001963001#/learn/announce
代码链接:https://pan.baidu.com/s/1E_aZTRQWOzGV-2GV_iH43w
提取码:64z9
声明:本文为作者投稿,版权归其个人所有。
热 文 推 荐
极客头条
都有 Python 了,还要什么编译器!
技术头条
☞ 35 岁程序员,年后第一天被辞退
☞ 云漫圈 | 学Python还是Java, 8张漫画带你全面分析
☞ 一次性掌握机器学习基础知识脉络 | 公开课笔记
☞ 骗局翻新, 暗网活跃度倍增, 2018加密货币犯罪报告敢看吗?
☞ 程序员年后离职跳槽指南
print_r('点个好看吧!');
var_dump('点个好看吧!');
NSLog(@"点个好看吧!");
System.out.println("点个好看吧!");
console.log("点个好看吧!");
print("点个好看吧!");
printf("点个好看吧!\n");
cout << "点个好看吧!" << endl;
Console.WriteLine("点个好看吧!");
fmt.Println("点个好看吧!");
Response.Write("点个好看吧!");
alert("点个好看吧!")
echo "点个好看吧!"
点击“阅读原文”,打开 CSDN App 阅读更贴心!
喜欢就点击“好看”吧!
只需 45 秒,Python 给故宫画一组手绘图!相关推荐
- python 画八角形步骤_只需45秒,Python给故宫画一组手绘图!
原标题:只需45秒,Python给故宫画一组手绘图! 作者 |丁彦军 来源 |恋习Python(ID:sldata2017) 13日早晨,当北京市民拉开窗帘时发现,窗外雪花纷纷扬扬在空中飘落,而且越下 ...
- python 归一化_只需 45 秒,Python 给故宫画一组手绘图!
作者 | 丁彦军 责编 | 伍杏玲 13日早晨,当北京市民拉开窗帘时发现,窗外雪花纷纷扬扬在空中飘落,而且越下越大,树上.草地.屋顶.道路上,都落满雪花.京城银装素裹,这是今冬以来北京迎来的第二场降雪 ...
- python 画八角形步骤_只需 45 秒,Python 给故宫画一组手绘图!
作者 | 丁彦军 责编 | 屠敏 13 日早晨,当北京市民拉开窗帘时发现,窗外雪花纷纷扬扬在空中飘落,而且越下越大,树上.草地.屋顶.道路上,都落满雪花.京城银装素裹,这是今冬以来北京迎来的第二场 ...
- 用python画函数的梯度图_只需45秒,用Python给故宫画一组雪景手绘图
原标题:只需45秒,用Python给故宫画一组雪景手绘图 导读:最近故宫总能"摊上事". 今天是元宵节,一批幸运鹅拿着在故宫门票预售网站瘫痪之前抢来的门票,夜游故宫,成为94年来第 ...
- python移动文件的函数_移动并重命名2000个文件,用Python,只需3秒
原标题:移动并重命名2000个文件,用Python,只需3秒 作者:陈熹.刘早起 来源:早起Python 今天介绍的案例是如何利用Python来 自动化移动.修改.重命名文件/夹,这样的操作在日常办公 ...
- 不可思议!英伟达新技术训练NeRF模型最快只需5秒,代码已开源
英伟达将训练 NeRF 模型从 5 小时缩至 5 秒. 你曾想过在 5 秒内训练完成狐狸的 NeRF 模型吗?现在英伟达做到了! 令人不可思议的是,就如谷歌科学家 Jon Barron 在推特上表示的 ...
- 合并excel文件 C语言,再见Ctrl + C!合并100个Excel表格,只需30秒!
原标题:再见Ctrl + C!合并100个Excel表格,只需30秒! 哈喽,大家好!在上篇文章< 你复制粘贴的那么认真,难怪天天加班[Excel教程] >中,我们给大家介绍了4种拆分工作 ...
- 应用悄悄拿走你的隐私做了什么?只需30秒这个AI给你答案
安妮 编译自 Futurism 量子位 出品 | 公众号 QbitAI "我已经阅读并了解--"可能是当代青年定期撒下的一个谎. 可能你深有体会. 几乎每个下载的App都有用户协议 ...
- 微信哪个电话能转人工服务器,如何联系微信人工客服?掌握好窍门,只需30秒可接通,亲测有效...
原标题:如何联系微信人工客服?掌握好窍门,只需30秒可接通,亲测有效 很多人都会使用微信,但是使用过程中难免会遇到问题,比如账号封号.转错账.支付问题等.如果在机器人自动回答中解决不了问题,想找人工客 ...
最新文章
- 数据结构与算法(2-2)线性表之链式存储(单链表、静态链表、循环链表、双向循环链表)
- 收藏 | 计算机网络基础知识总结
- NTU 课程笔记 CV6422 Statistical Methods Applications (1) 基本统计知识
- Re题目------Enm.exe
- 工信部企业信息核查 谋定“互联网+监管”经信研究创新实践
- HDP安全之集成kerberos/LDAP、ranger;安装部署kerberos;安装Knox;安装LDAP;启动LDAP;验证Knox网关
- php设计模式 -- 工厂模式
- SAP Commerce Cloud Spartacus UI 4.0.1 版本的安装
- M| SQL 导入导出的时候数据库表的主键和自动编号丢失 怎么办
- java 调用 js性能_太快了,太变态了:什么会影响Java中的方法调用性能?
- 中文WAP浏览器WapDisplayer V1.5发布
- Python小白的数学建模课-02.数据导入
- 信息学奥赛一本通 1110:查找特定的值 | OpenJudge NOI 1.9 01
- python中or的用法_解析python中and与or用法
- java编译时绑定_为什么Java在编译时绑定变量?
- 谷歌官方Android镜像下载(中文站)
- South by Southwest任命Brightcove为2021年线上活动官方视频合作伙伴
- css clac计算属性
- 计算机显卡驱动全部卸载,Win7彻底卸载NVIDIA显卡驱动程序的办法
- Win 7 远程桌面报错“出现身份验证错误,要求的函数不受支持”解决办法
热门文章
- 矩池云安装gcc4.9和g++4.9简单教程
- 聚类算法 距离矩阵_论文阅读9——AP聚类算法
- oracle的rac环境,RAC环境数据库的备份
- asp.net gridview 模板列 弹出窗口编辑_如何使用极速PDF编辑器的注释工具?
- C++11多线程---future和promise
- 凝胶成像文件行业调研报告 - 市场现状分析与发展前景预测
- skylark 叫响中国云计算时代(类GAE云计算平台)
- 彻底搞清 Flink 中的 Window 机制
- 2020年接近尾声,我选择来鲲鹏开发者技术峰会学点干货!
- 入选 Gartner 魔力象限,剖析华为云 GaussDB 数据库演进之路