故宮下雪之後!我花了45秒,用Python給它畫了一組手繪圖
本文授權轉自 | 戀習 Python
這是戀習Python之手把手系列第10篇原創首發文章
這幾天,許多城市,迎來了2019年的第一場雪
13日早晨,當北京市民拉開窗簾時發現,窗外雪花紛紛揚揚在空中飄落
而且越下越大,樹上、草地、屋頂、道路上...都落滿雪花
京城銀裝素裹,這是今冬以來北京迎來的第二場降雪
一下雪,北京就變成了北平,故宮就變成了紫禁城
八萬張門票在雪花飄下來之前,便早已預訂一空
看著朋友圈、微博好友都在紛紛曬圖,小編只能羨慕不已。
不過,戀習Python突然想到,可以透過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:\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=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 :光源對x,y,z三方向的影響程度
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:\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;
除了生娃,啥都能幹!!
歡迎大家在留言處,留言自己曾經用Python做過哪些有意思的事!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31545820/viewspace-2636671/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 只需45秒,Python給故宮畫一組手繪圖!Python繪圖
- Python 精靈模組_幀動畫_純畫筆下雪效果.pyPython動畫
- “融古鑠今 無界未來”騰訊聯手故宮推出故宮建築文化遊戲《故宮:口袋宮匠》遊戲
- 快端午了,用Python畫一盤粽子送給你Python
- 我花了一夜用資料結構給女朋友寫個H5走迷宮遊戲資料結構H5遊戲
- 敲了幾萬行原始碼後,我給Mybatis畫了張“全地圖”原始碼MyBatis地圖
- 《明日方舟》:花了一百五後,我找不到下一個付費點了
- 用Python的random模組繪製折線圖Pythonrandom
- python繪圖之matplotlibPython繪圖
- 我花了一週讀了Kafka Producer的原始碼Kafka原始碼
- 用 Canvas + WASM 畫一個迷宮CanvasASM
- 用Python繪製一天之內的氣溫變化圖Python
- 關於AI 繪畫,我給你總結了一份詳細的關鍵詞(Prompt 知識)AI
- 用AI繪畫怎麼可以把照片一鍵生成漫畫圖?詳細ai繪畫教程來啦!AI
- 【Android繪圖】繪圖之基礎篇(一)Android繪圖
- java繪圖基礎 : 用java程式碼畫一個房子Java繪圖
- 我用 Python 擼了一個 plist 圖集拆圖工具!附上github原始碼PythonGithub原始碼
- 花了一個星期,我終於把RPC框架整明白了!RPC框架
- 圖片轉繪畫效和繪畫軟體
- 花了20分鐘,給女朋友們寫了一個web版群聊程式Web
- 故宮博物院:2019年故宮博物院客流量突破1900萬人次
- WPF 之繪畫(十一)
- 別再問我們用什麼畫圖的了!問就是excalidraw
- python繪圖Python繪圖
- Python 繪圖Python繪圖
- 我花了 24 小時,“重新"實現了一版ant design pro
- 《九十六號公路》:永別了,我的故鄉
- 手機的九宮格圖案解鎖總共能繪出多少種圖案?
- DrawPad 圖形繪畫工具
- DrawPad圖形繪畫工具
- 畫圖板的重繪
- 聖誕節到了!!你的桌面下雪了嗎?? - Qt趣味開發之讓你的桌面下雪QT
- Python:用tqdm模組繪製進度條Python
- 企業組織結構圖怎麼畫?分享一些結構圖的繪製方法
- canvas 塗鴉畫板,支援筆寫、手寫、滑鼠繪圖Canvas繪圖
- 寫了一套優雅介面之後,領導讓我給大家講講這背後的技術原理
- 我畫了13張圖,用最通俗易懂的話講HTTPS,拿下!HTTP
- fallingsnow.js-jquery下雪動畫特效JSjQuery動畫特效