作者 |   丁彦军

责编 | 屠敏

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

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

看着朋友圈、微博好友都在纷纷晒图,作为程序员的我只能坐在办公室里羡慕不已。

不过普通人得去故宫赏雪,程序员可以直接坐在家里动动手指便可以欣赏到故宫的美丽雪景手绘图了。如何操作呢?可通过 Python 将故宫的建筑物图片,转化为手绘图(素描效果)。效果图如下:

概念与原理

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

黑白灰色

边界线条较重

相同或相近色彩趋于白色

略有光源效果

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

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

以 Sobel 梯度计算来解释:

首先计算出  、,然后计算梯度角

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

图像的数组形式与变换

其中,需要用到的方法:

Image.open ( ) :   打开图片

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

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

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

代码如下:

from   PIL   import   Image

import   numpy   as   np

im   =   Image.open ( r"C:UsersAdministratorDesktopgugong 微信图片 _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=grad

grad_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   Image

import   numpy   as   np

import   os

import   join

import   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:UsersAdministratorDesktopgugong" )

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

声明:本文为作者投稿,版权归其个人所有。

热 文  推 荐

print_r ( ' 点个好看吧!' ) ;

var_dump ( ' 点个好看吧!' ) ;

NSLog ( @" 点个好看吧!" ) ;

System.out.println ( " 点个好看吧!" ) ;

console.log ( " 点个好看吧!" ) ;

print ( " 点个好看吧!" ) ;

printf ( " 点个好看吧!n" ) ;

cout  <

Console.WriteLine ( " 点个好看吧!" ) ;

fmt.Println ( " 点个好看吧!" ) ;

Response.Write ( " 点个好看吧!" ) ;

alert ( " 点个好看吧!" )

echo " 点个好看吧!"

点击 " 阅读原文 ",打开 CSDN App 阅读更贴心!

喜欢就点击 " 好看 " 吧!

原网页已经由 ZAKER 转码以便在移动设备上查看

python画彩色城墙_只需 45 秒,Python 给故宫画一组手绘图!相关推荐

  1. python 画八角形步骤_只需45秒,Python给故宫画一组手绘图!

    原标题:只需45秒,Python给故宫画一组手绘图! 作者 |丁彦军 来源 |恋习Python(ID:sldata2017) 13日早晨,当北京市民拉开窗帘时发现,窗外雪花纷纷扬扬在空中飘落,而且越下 ...

  2. python 画八角形步骤_只需 45 秒,Python 给故宫画一组手绘图!

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

  3. 用python画函数的梯度图_只需45秒,用Python给故宫画一组雪景手绘图

    原标题:只需45秒,用Python给故宫画一组雪景手绘图 导读:最近故宫总能"摊上事". 今天是元宵节,一批幸运鹅拿着在故宫门票预售网站瘫痪之前抢来的门票,夜游故宫,成为94年来第 ...

  4. python 归一化_只需 45 秒,Python 给故宫画一组手绘图!

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

  5. 只需 45 秒,Python 给故宫画一组手绘图!

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

  6. bert获得词向量_只需几行 Python 代码,即可用 BERT 玩转词嵌入!

    作者 | Anirudh_S 译者 | Sambodhi 编辑 | 张之栋 AI 前线导读: 在自然语言处理领域中,诞生于 2018 年末的 BERT 非常的"火热".强悍如 BE ...

  7. python画漏斗图_只需简单几步,教你用python完成漏斗图的绘制

    商业分析中经常会用到漏斗图.尤其是在网站流量监控.电商商品转化等一些数据运营方面.漏斗图之所以是漏斗就就是倒三角的形状,是因为用户或者流量,集中从某个功能点进入,很大可能会按照产品本身设定的流程来完成 ...

  8. python的控件text的文本属性_只需6行Python代码就给图片加上水印——你一看就会了...

    大家在做项目开发的过程中,会不会经常遇到需要处理图片却没有快速有效的工具的情况呢?比如客户需要给图片加上水印,你可能会用到PS这些高级软件去处理,这样虽然有效果但是需要相对较长的时间:作为程序猿,你一 ...

  9. python好看图案的编程代码_只需15行Python代码,实现图像定位功能

    引言本教程使用的环境:Windows 10 + Python 3.6 数据源:The Oxford-IIIT Pet Dataset 需要的第三方库:import tensorflow as tf i ...

  10. python国际象棋ai程序_只需五步!手把手教你搭建国际象棋AI机器人

    王新民 编译 量子位 报道 | 公众号 QbitAI 要创建一个简单的象棋AI,我们在开始编程之前要先了解四个基本的概念:移动生成.棋局评估.最大最小搜索和α-β剪枝搜索过程. 在每个步骤中,我们将会 ...

最新文章

  1. SAP-PM-预防性维护-01-概览
  2. LNMP(php-fpm的pool,慢执行日志,定义open_bashdir,php-fpm进程管理
  3. python简介怎么写-python中如何写类
  4. 今天碰到一道比较有趣的面试题,大家来探讨一下。
  5. Jquery获取了元素
  6. python网络爬虫(14)使用Scrapy搭建爬虫框架
  7. Java获取各种常用时间方法
  8. 疫情当前,宅家学习不无聊,AI视频课程资源盘点
  9. 总结 · 二分图匹配
  10. google bigtable论文原文_CTR论文笔记[1]:Wideamp;Deep
  11. C/C++编译、测试须知、须会,CMake、Boost等
  12. hive3新增資料_Hive表新增字段后,新字段无法写入值问题总结
  13. mysql锁表查询_Mysql upate 更新锁表还是锁行测试
  14. 05-Servlet与内部加载机制(part1)
  15. python---小技巧
  16. chrome插件介绍
  17. 多浏览器支持ActiveX控件
  18. 图片怎么转文字?建议收藏这些方法
  19. Java中间件mock_JAVA中间件Diamond整理
  20. android usb摄像头 前后置,android – 在后置和前置摄像头之间切换

热门文章

  1. html把圆形分成10份,CSS八等分圆的实现示例
  2. 电子万年历——沐雨先生
  3. 股市最好用的大数据软件_炒股软件app哪个最好用?老股民说你有这个就够了
  4. c语言编程悬臂梁受力分析,悬臂梁受力的分析.doc
  5. 雷达多普勒频率计算公式_手持式雷达电波流速仪应用
  6. 锂电池是什么材料做的
  7. python图片灰度化处理
  8. Oracle中针对中文进行排序
  9. pg数据库的一些问题
  10. python识别手写文字_深度学习---手写字体识别程序分析(python)