大家好,感谢邀请,今天来为大家分享一下故宫下雪了!我用Python给它画了一套手绘图,只用了45秒(附代码)的问题,以及和的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!
13日上午,当北京市民拉开窗帘时,发现窗外的雪花在空中飘落,并且越来越大。树木、草地、屋顶、道路……都被雪花覆盖了。首都被白雪覆盖。这是今年冬天以来的第一次。北京第二场雪。一下雪,北京就变成了北平,故宫就变成了故宫。雪花飘落前,8万张门票已全部预订完毕。
然而我们突然想到可以通过Python将故宫建筑图片转换成手绘图(素描效果)。效果图如下:
一、概念与原则
我们都知道手绘效果的主要特点是:
黑、白、灰;较粗的边框线;相同或相似的颜色往往是白色;轻微的光源效应。核心原理:利用像素之间的梯度值和虚拟深度值来重建图像,根据灰度变化来模拟人类视觉的程度。
将图像视为二维离散函数。灰度梯度实际上就是这个二维离散函数的推导。使用差值而不是微分来求图像的灰度梯度。一些常用的灰度梯度模板有:Roberts梯度、Sobel梯度、Prewitt梯度、Laplacian梯度。
用Sobel梯度计算解释:
首先计算
,
,然后计算梯度角度
梯度方向以及图像灰度增加的方向,其中梯度方向的梯度角大于平坦区域的梯度角。如下图所示,灰度值增大的方向梯度角度较大。此时梯度角度大的方向就是梯度方向。对应于寻找图像中某一点的梯度方向,计算该点与其相邻八个点之间的梯度角。最大梯度角度就是梯度方向。
2. 图像的数组形式和变换
其中,需要用到的方法:
Image.open( ): 打开图像np.array( ) : 将图像转换为数组Convert('L'): 将图像转换为二维灰度图像Image.fromarray( ): 将数组恢复为图像uint8格式代码如下:
from PIL import Imageimport numpy as npim=Image.open(r'C:\Users\Administrator\Desktop\gugong\WeChat picture_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 * height/100.#归一化grad_x值grad_y=grad_y * height/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,深度=10): a=np.asarray(Image.open(sta).convert('L')).astype('float') 深度=heights # 深度的取值范围(0-100),标准为10 grad=np.gradient(a) # 获取图像灰度的梯度值grad_x, grad_y=grad # 获取图像水平和垂直的梯度值分别grad_x=grad_x * height/100.#归一化grad_x 值grad_y=grad_y * height/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. # 光源的方位角,弧度value dx=np.cos(vec_el ) * np.cos(vec_az) # 光源对x轴的影响dy=np.cos(vec_el) * np.sin(vec_az) # 光源对x轴的影响在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) forstartss: 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('程序为running----' + str(end_time - start_time) + 'seconds') time.sleep(3)main( )程序跑了----43.01828205879955秒#共35张图片。最终效果对比:
其他图片就不一一列举了。如需获取更多图片素材,可在后台回复“故宫雪景”获取;您还可以使用此代码为自己绘制手绘图;你也可以为你的家乡或母校画一张。
最后提醒:
人生苦短,我用Python;
除了生孩子,我什么都能做!
欢迎大家在留言框中留言,说说你用Python做了什么有趣的事情!
校对:陈瑞庆
- 超过-
用户评论
哇塞!太美了!这雪花描绘的感觉真的超级精致,完全能感受到故宫冬日里的宁静和美丽。你用Python的能力也太牛了吧,这个速度实在令人惊叹!
有6位网友表示赞同!
雪落故宫的画面总是那么诗意,你的手绘图捕捉到了这份独一无二的景色。45秒就能完成? 厉害了兄弟! 代码看起来也蛮简单的,今度试着自己改下试试.
有9位网友表示赞同!
我之前去过故宫,那恢宏的气场让人记忆深刻。 看到你用Python把雪场景画出来,仿佛又回到了冬日里的故宫,很有画面感啊!这代码看着的确简洁明了 ,有兴趣看看其他的作品
有19位网友表示赞同!
厉害啊,这么快就能生成手绘风格的图? 感觉比我平常用的绘图软件还要快很多呢,Python果然很神奇~ 希望能看到更多用Python创作的美术作品!
有6位网友表示赞同!
我一直觉得故宫很壮观,但想象它下雪的样子却从未想过。你的画让我看到了一个全新、美丽的景象。你真厉害啊!这种快速生成艺术效果的代码实在太酷了!
有10位网友表示赞同!
这个手绘风格有点简单,个人感觉有点像马赛克的感觉, 缺少了细节和层次感。不过用Python渲染雪景还是挺特别的,很有创意.
有9位网友表示赞同!
故宫下雪确实非常美,你的图片虽然风格比较粗犷,但是捕捉到冬日的氛围,我很喜欢这个画面。希望你能尝试更多不同的艺术风格!
有13位网友表示赞同!
我觉得这图片的色彩有点单调,缺乏层次感和变化, 45秒生成的结果的确快, 但是细节没有体现得太好。
有8位网友表示赞同!
用Python做绘画有点新奇,没想到还能画出这样不错的画面! 不过希望可以看到你尝试更复杂的作品 展示 Python 的更多可能性.
有11位网友表示赞同!
这代码的效率真是太高了! 不过手绘风格看着确实简单了些。感觉像是用工具批量生成的,缺失一些手工制作的温情和个性。
有9位网友表示赞同!
看图片就觉得很美,雪下的故宫格外的宁静。你的代码看起来很有潜力,期待看到你以后开发更多创意的作品!
有11位网友表示赞同!
这个渲染效果有点儿像早期电脑游戏画面呢, 哈哈,挺有回忆感的! 不过速度确实是惊人的啊,希望你能继续完善算法,让画面的质感更高更细腻.
有11位网友表示赞同!
故宫下雪总是那么浪漫。我虽然不是专业的程序员, 但是也能感受到你的Python代码写得非常简洁明了, 你太厉害了!
有14位网友表示赞同!
这个画风不错啊! 看着感觉很有童话故事的梦幻感。 期待以后看到你用Python创作更多不同的场景和风格的作品.
有11位网友表示赞同!
45秒的时间渲染这样一幅画面确实令人惊叹, 这技术水平真的厉害! 你代码真行,我收藏了!
有20位网友表示赞同!
有点遗憾的是,图片缺少一些细节刻画, 比如人物、动物等。 如果可以添加更多元素,画面会更丰富更有故事性.
有5位网友表示赞同!
我觉得这个手绘风格很特别,很具有创新精神! 不知道你还会用Python创作什么类型的艺术作品呢? 我期待你的下一步!
有6位网友表示赞同!
这代码真棒! 让我感觉Python学习一点都很有乐趣。 后面可以用Python生成一些更复杂的作品吗?
有7位网友表示赞同!
我对故宫非常感兴趣,看到它下雪的照片让人陶醉。 你用Python创作的这个手绘图,带给我一种独特的视觉体验。 希望能看到更多你的作品!
有11位网友表示赞同!