13日早晨,当北京市民拉开窗帘时发现,窗外雪花纷纷扬扬在空中飘落,而且越下越大,树上、草地、屋顶、道路上,都落满雪花。京城银装素裹,这是今冬以来北京迎来的第二场降雪。

一下雪,北京就变成了北平,故宫就变成了紫禁城。八万张门票在雪花飘下来之前,便早已预订一空。

(图片来源:故宫官网 版权归故宫官网所有)

看着朋友圈、微博好友都在纷纷晒图,小编只能羡慕不已。

不过,突然想到,可以通过Python将故宫的建筑物图片,转化为手绘图(素描效果)。效果图如下:

一、概念与原理

我们都知道手绘图效果的特征主要有:

黑白灰色;边界线条较重;相同或相近色彩趋于白色;略有光源效果

核心原理:利用像素之间的梯度值和虚拟深度值对图像进行重构,根据灰度变化来模拟人类视觉的模拟程度

把图像看成二维离散函数,灰度梯度其实就是这个二维离散函数的求导,用差分代替微分,求取图像的灰度梯度。常用的一些灰度梯度模板有:Roberts 梯度、Sobel 梯度、Prewitt 梯度、Laplacian 梯度。

以Sobel 梯度计算来解释:

首先计算出

,然后计算梯度角

梯度方向及图像灰度增大的方向,其中梯度方向的梯度夹角大于平坦区域的梯度夹角。如下图所示,灰度值增加的方向梯度夹角大,此时梯度夹角大的方向为梯度方向。对应在图像中寻找某一点的梯度方向即通过计算该点与其8邻域点的梯度角,梯度角最大即为梯度方向。

二、图像的数组形式与变换

其中,需要用到的方法:

Image.open( ): 打开图片

np.array( ) : 将图像转化为数组

convert("L"): 将图片转换成二维灰度图片

Image.fromarray( ): 将数组还原成图像uint8格式

代码如下:

from PIL import Imageimport numpy as npim = 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 :光源对x,y,z三方向的影响程度

3、梯度归一化

构造x和y轴梯度的三维归一化单位坐标系;

梯度与光源相互作用,将梯度转化为灰度。

4、图像生成

具体详情代码如下:

from PIL import Imageimport numpy as npimport osimport joinimport timedef 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张图片

最终效果图对比:

最后,你自己动手试试吧?通过此代码为自己画一张手绘图,也可以为自己的家乡或母校画。

参考资料:

http://www.icourse163.org/learn/BIT-1001870002?tid=1001963001#/learn/announce

代码链接:

https://pan.baidu.com/s/1E_aZTRQWOzGV-2GV_iH43w

提取码:64z9

打开APP精彩内容

点击阅读全文

python画建筑物_通过Python将故宫的建筑物图片,转化为手绘图相关推荐

  1. 用python画风车_用Python画小女孩放风筝的示例

    我就废话不多说了,直接上代码吧! # coding:utf-8 2import turtle as t 3import random 4# 画心 5def xin(): 6 def curvemove ...

  2. 用python画圆锥_用python画一幅美瞳,今日份来自程序员的浪漫

    如果说,眼睛是心灵的窗户,那么,美瞳就是心灵的彩窗,就像下图中这样. 而我们今天所要挑战的,就是用python画美瞳,而且是五分钟之内画三百副争奇斗艳.各领风骚.绝不重样的美瞳.作为这颗地球上最纯情的 ...

  3. 怎么用python画房子_用python画一个小房子

    用python画一个小房子 2020年07月22日 | 萬仟网IT编程 | 我要评论 如何用python画一个小房子?效果图如下:代码如下:import turtle# 前置p = turtle.Pe ...

  4. python turtle画房子代码里面的窗子,如何用python画房子_用python画一个小房子

    如何用python画一个小房子? 效果图如下: 代码如下: import turtle # 前置 p = turtle.Pen() # 作者要说的话 for i in range(6): print( ...

  5. 用python画佩奇_使用python画个小猪佩奇的示例代码

    基本原理 选好画板大小,设置好画笔颜色.粗细,定位好位置,依次画鼻子.头.耳朵.眼睛.腮.嘴.身体.手脚.尾巴,完事儿. 都知道,Turtle 是 Python 内置的一个比较有趣味的模块,俗称&qu ...

  6. 用python画皇冠_用python做数字油画或者从一幅画学习风格,去画另一幅画

    原博文 2018-08-30 17:12 − 1. 用python做数字油画 模块: pillow 2. 从一幅画学习风格,去画另一幅画 http://pytorch.org/tutorials/ad ...

  7. 利用python画曲线_利用python画出AUC曲线的实例

    以load_breast_cancer数据集为例,模型细节不重要,重点是画AUC的代码.1XS免费资源网 直接上代码:1XS免费资源网 from sklearn.datasets import loa ...

  8. 利用python画曲线_利用Python绘制血药浓度-时间曲线——口服吸收一室模型

    血药浓度-时间曲线一般是通过拟合所测定的血药浓度点而画出来的,但是在某些时候,如阅读文献时,我们需要根据别人报道的PK参数来画出药时曲线.Python语法简单,拥有丰富的开源库,下面尝试通过Pytho ...

  9. 用python画明星_用Python画一颗特别的心送给她

    [前言] 520刚过去了,大家有没有跟自己喜欢的对象在一起呢? 520 当天你还在送 玫瑰花?巧克力?情侣套装?... 小编就想说:你能不能换点新意呢,这些操作已经普通的不能再普通了吧!就像别人来例假 ...

  10. python画雪_用Python画一棵带音乐的雪夜圣诞树

    本文我们用 Python 来画一棵带音乐效果的雪夜圣诞树,基本思路如下:用 Python 画一棵圣诞树作为背景图 在圣诞树背景图中添加雪落效果及音乐 下面来看一下具体实现. 首先,我们来画一棵圣诞树, ...

最新文章

  1. Meanshift图像平滑之opencv实现
  2. tf.layers.Dense与 tf.layers.dense的区别
  3. corosync和pacemaker实现httpd和mysql双集群
  4. ios jsonkit 报错_iOS开源项目:JSONKit
  5. 第一二章(PTA复习)
  6. 微信公众帐号开发教程第8篇-文本消息中使用网页超链接
  7. flex皮肤制作---通过flash
  8. html flash rtmp,Web直播之RTMP协议:vue-video-player + videojs-flash
  9. 如何成为一名汽车软件工程师?
  10. MSN退休,寻找微软如何融合MSN的答案:体验skype6国际版MSN功能。
  11. c语言编程入门教程网易,C语言入门视频教程汇总,看了无师自通
  12. Android RecyclerView详解及实现瀑布流式布局
  13. ZZULIOJ--2825: 收集金币
  14. php onblur=,onblur
  15. 怎么下载jQuery文件
  16. 安装RSF自动化环境
  17. 大厂程序员教你如何写简历(附简历模板)//简历、秋招、简历模板。经验分享、资源分享
  18. 未能将管道连接到虚拟机: 所有的管道范例都在使用中
  19. 疲劳检测——眨眼检测
  20. NOIP2012P4 文化之旅 题解

热门文章

  1. C++之责任链(Chain of Responsibility)模式
  2. 信息系统分析与设计 第三章 信息系统建设概论
  3. 《缠中说禅108课》53:三类买卖点的再分辨
  4. ubuntu安装配置搜狗拼音输入法
  5. lopatkin俄大神精简Windows 10 Pro 19041.450 20H1 Release x86-x64 ZH_CN DREY[2020-08-19]
  6. 使用Swagger生成 API 文档(go语言示例)
  7. 如何使用Steam在线播放游戏
  8. 植物大战僵尸修改存档用户名、关卡、金钱说明
  9. 北京中波(AM-MW)无线广播发射频率/频道表 (转载)
  10. 深入浅出推荐系统(四):召回:向量化的潮流