Python手繪圖瞭解一下!

Python手繪圖瞭解一下!
13日早晨,當北京市民拉開窗簾時發現,窗外雪花紛紛揚揚在空中飄落,而且越下越大,樹上、草地、屋頂、道路上,都落滿雪花。京城銀裝素裹,這是今冬以來北京迎來的第二場降雪。

一下雪,北京就變成了北平,故宮就變成了紫禁城。八萬張門票在雪花飄下來之前,便早已預訂一空。

Python手繪圖瞭解一下!
看着朋友圈、微博好友都在紛紛曬圖,小編只能羨慕不已。

不過,突然想到,可以通過Python將故宮的建築物圖片,轉化爲手繪圖(素描效果)。效果圖如下:

Python手繪圖瞭解一下!
一、概念與原理

我們都知道手繪圖效果的特徵主要有:

黑白灰色;邊界線條較重;相同或相近色彩趨於白色;略有光源效果
核心原理:利用像素之間的梯度值和虛擬深度值對圖像進行重構,根據灰度變化來模擬人類視覺的模擬程度

把圖像看成二維離散函數,灰度梯度其實就是這個二維離散函數的求導,用差分代替微分,求取圖像的灰度梯度。常用的一些灰度梯度模板有:Roberts 梯度、Sobel 梯度、Prewitt 梯度、Laplacian 梯度。

以Sobel 梯度計算來解釋:

首先計算出

Python手繪圖瞭解一下!

Python手繪圖瞭解一下!
,然後計算梯度角

Python手繪圖瞭解一下!
梯度方向及圖像灰度增大的方向,其中梯度方向的梯度夾角大於平坦區域的梯度夾角。如下圖所示,灰度值增加的方向梯度夾角大,此時梯度夾角大的方向爲梯度方向。對應在圖像中尋找某一點的梯度方向即通過計算該點與其8鄰域點的梯度角,梯度角最大即爲梯度方向。

Python手繪圖瞭解一下!
二、圖像的數組形式與變換

Python手繪圖瞭解一下!
其中,需要用到的方法:

Image.open( ): 打開圖片
np.array( ) : 將圖像轉化爲數組
convert("L"): 將圖片轉換成二維灰度圖片
Image.fromarray( ): 將數組還原成圖像uint8格式
代碼如下:

Python手繪圖瞭解一下!
三、圖像的手繪效果處理

實現思路步驟:

1、梯度的重構

numpy的梯度函數的介紹
np.gradient(a) : 計算數組a中元素的梯度,f爲多維時,返回每個維度的梯度

離散梯度: xy座標軸連續三個x軸座標對應的y軸值:a, b, c 其中b的梯度是(c-a)/2

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

當爲二維數組時,np.gradient(a) 得出兩個數組,第一個數組對應最外層維度的梯度,第二個數組對應第二層維度的梯度。

代碼如下:
Python手繪圖瞭解一下!
2、構造guan光源效果

設計一個位於圖像斜上方的虛擬光源光源相對於圖像的視角爲Elevation,方位角爲Azimuth建立光源對各點梯度值的影響函數運算出各點的新像素值
Python手繪圖瞭解一下!
其中:

np.cos(evc.el) : 單位光線在地平面上的投射長度

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

3、梯度歸一化

構造x和y軸梯度的三維歸一化單位座標系;
梯度與光源相互作用,將梯度轉化爲灰度。
4、圖像生成

具體詳情代碼如下:
Python手繪圖瞭解一下!
最終效果圖對比:
Python手繪圖瞭解一下!
最後,你自己動手試試吧?通過此代碼爲自己畫一張手繪圖,也可以爲自己的家鄉或母校畫。如果你跟我一樣都喜歡python,想成爲一名優秀的程序員,也在學習python的道路上奔跑,歡迎你加入python學習羣:839383765 羣內每天都會分享最新業內資料,分享python免費課程,共同交流學習,讓學習變(編)成(程)一種習慣!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章