13日早晨,當北京市民拉開窗簾時發現,窗外雪花紛紛揚揚在空中飄落,而且越下越大,樹上、草地、屋頂、道路上,都落滿雪花。京城銀裝素裹,這是今冬以來北京迎來的第二場降雪。
一下雪,北京就變成了北平,故宮就變成了紫禁城。八萬張門票在雪花飄下來之前,便早已預訂一空。
(圖片來源:故宮官網版權歸故宮官網所有)
看著朋友圈、微博好友都在紛紛曬圖,小編只能羨慕不已。
不過,突然想到,可以通過Python將故宮的建筑物圖片,轉化為手繪圖(素描效果)。效果圖如下:
一、概念與原理
我們都知道手繪圖效果的特征主要有:
黑白灰色;邊界線條較重;相同或相近色彩趨于白色;略有光源效果
核心原理:利用像素之間的梯度值和虛擬深度值對圖像進行重構,根據灰度變化來模擬人類視覺的模擬程度
把圖像看成二維離散函數,灰度梯度其實就是這個二維離散函數的求導,用差分代替微分,求取圖像的灰度梯度。常用的一些灰度梯度模板有:Roberts 梯度、Sobel 梯度、Prewitt 梯度、Laplacian 梯度。
以Sobel 梯度計算來解釋:
首先計算出、
,然后計算梯度角?
梯度方向及圖像灰度增大的方向,其中梯度方向的梯度夾角大于平坦區域的梯度夾角。如下圖所示,灰度值增加的方向梯度夾角大,此時梯度夾角大的方向為梯度方向。對應在圖像中尋找某一點的梯度方向即通過計算該點與其8鄰域點的梯度角,梯度角最大即為梯度方向。
二、圖像的數組形式與變換
其中,需要用到的方法:
Image.open( ):打開圖片
np.array( ): 將圖像轉化為數組
convert("L"):將圖片轉換成二維灰度圖片
Image.fromarray( ):將數組還原成圖像uint8格式
代碼如下:
fromPILimportImageimportnumpyasnpim=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=gradgrad_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、圖像生成
具體詳情代碼如下:
fromPILimportImageimportnumpyasnpimportosimportjoinimporttimedefimage(sta,end,depths=10):a=np.asarray(Image.open(sta).convert('L')).astype('float')depth=depths#深度的取值范圍(0-100),標準取10grad=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/Auni_y=grad_y/Auni_z=1./Avec_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)defmain():xs=10start_time=time.clock()startss=os.listdir(r"C:UsersAdministratorDesktopgugong")time.sleep(2)forstartsinstartss:start=''.join(starts)sta='C:/Users/Administrator/Desktop/gugong/'+startend='C:/Users/Administrator/Desktop/gugong/'+'HD_'+startimage(sta=sta,end=end,depths=xs)end_time=time.clock()print('程序運行了----'+str(end_time-start_time)+'秒')time.sleep(3)main()程序運行了----43.01828205879955秒#一共35張圖片
最終效果圖對比:
最后,你自己動手試試吧?通過此代碼為自己畫一張手繪圖,也可以為自己的家鄉或母校畫。
參考資料:
http://www.icourse163.org/learn/BIT-1001870002?tid=1001963001#/learn/announce
代碼鏈接:
https://pan.baidu.com/s/1E_aZTRQWOzGV-2GV_iH43w
提取碼:64z9
-
圖像
+關注
關注
2文章
1089瀏覽量
40599 -
梯度
+關注
關注
0文章
30瀏覽量
10363 -
python
+關注
關注
56文章
4811瀏覽量
85092
原文標題:只需45秒,Python給故宮畫一組手繪圖!
文章出處:【微信號:rgznai100,微信公眾號:rgznai100】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
雷直擊建筑物時電流分布的電磁場數值分析pdf
建筑物火災并非只是電線電纜之過
利用Python將PDF轉化為圖片的方法
?iMX6UL工業級核心板在建筑物能耗管理系統中的應用方案
大型水利水電工程建筑物三維可視化建模技術研究
一種基于機器學習的建筑物分割掩模自動正則化和多邊形化方法
建筑物防雷保護設計淺析
建筑物的泛光照明設計
物聯網轉化了人物對建筑物的認知,并縮減運營開銷且更加環保
建筑物防雷工程的設計與施工
![<b class='flag-5'>建筑物</b>防雷工程的設計與施工](https://file.elecfans.com/web2/M00/83/07/poYBAGOX3teALZLUAADv5bNeHms600.png)
建筑物防雷檢測安全接地應用解決方案
![<b class='flag-5'>建筑物</b>防雷檢測安全接地應用解決方案](https://file.elecfans.com/web2/M00/80/C3/poYBAGOOoxKAOmDZABeoTKs8Vmo526.png)
評論