首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

只需45秒,用Python给故宫画一组雪景手绘图

导读:最近故宫总能“摊上事”。

今天是元宵节,一批幸运鹅拿着在故宫门票预售网站瘫痪之前抢来的门票,夜游故宫,成为94年来第一批在故宫赏月的人。用这种方式过节,真是既时尚又怀旧,简直没sei了。不知道你去了没有?

昨夜今晨,北京又下了一场雪,前些天刷爆朋友圈的故宫雪景照,又出了续集。抢不到晚上赏月的门票,白天去看看雪景也是不错的选择。不知道你去了没有?

今天我们要说的就跟雪景有关……

作者:丁彦军

来源:恋习Python(ID:sldata2017)

一下雪,北京就变成了北平,故宫就变成了紫禁城。

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

▲图片来自微信公众号微故宫

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

01 概念与原理

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

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

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

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

以Sobel 梯度计算来解释:

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

02 图像的数组形式与变换

其中,需要用到的方法:

Image.open( ): 打开图片

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

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

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

代码如下:

03 图像的手绘效果处理

实现思路步骤:

1. 梯度的重构

numpy的梯度函数的介绍:

np.gradient(a) : 计算数组a中元素的梯度,f为多维时,返回每个维度的梯度

离散梯度: xy坐标轴连续三个x轴坐标对应的y轴值:a, b, c 其中b的梯度是(c-a)/2

而c的梯度是: (c-b)/1

当为二维数组时,np.gradient(a) 得出两个数组,第一个数组对应最外层维度的梯度,第二个数组对应第二层维度的梯度。

代码如下:

2. 构造guan光源效果

设计一个位于图像斜上方的虚拟光源

光源相对于图像的视角为Elevation,方位角为Azimuth

建立光源对各点梯度值的影响函数

运算出各点的新像素值

其中:

np.cos(evc.el) : 单位光线在地平面上的投射长度

dx,dy,dz :光源对x,y,z三方向的影响程度

3. 梯度归一化

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

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

4. 图像生成

具体详情代码如下:

最终效果图对比:

▲原始图片来自微信公众号微故宫

其他图片就不一一列举。你也可以通过此代码为自己画一张手绘图;也可以为自己的家乡或母校画。

人生苦短,我用Python;

除了生娃,啥都能干!

参考资料:北京理工大学的嵩天老师的网络课程

据统计,99%的大咖都完成了这个神操作

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190219B1AY9V00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券