Python項目1:實現將圖片轉化為手繪效果


先上代碼

 1 from PIL import Image
 2 import numpy as np
 3 
 4 a = np.asarray(Image.open(r'C:\Users\jian12.guo\Desktop\tupian\mingren.jpeg').convert('L')).astype('float')
 5 depth = 10.  # (0-100)
 6 grad = np.gradient(a)                                # 取圖像灰度的梯度值
 7 grad_x, grad_y = grad                                # 分別取橫縱圖像梯度值
 8 grad_x = grad_x * depth / 100.
 9 grad_y = grad_y * depth / 100.
10 A = np.sqrt(grad_x ** 2 + grad_y ** 2 + 1.)
11 uni_x = grad_x / A
12 uni_y = grad_y / A
13 uni_z = 1. / A
14 
15 vec_el = np.pi / 2.2                                # 光源的俯視角度,弧度值
16 vec_az = np.pi / 4.                                # 光源的方位角度,弧度值
17 dx = np.cos(vec_el) * np.cos(vec_az)                      # 光源對x 軸的影響
18 dy = np.cos(vec_el) * np.sin(vec_az)                      # 光源對y 軸的影響
19 dz = np.sin(vec_el)                                # 光源對z 軸的影響
20 
21 b = 255 * (dx * uni_x + dy * uni_y + dz * uni_z)               # 光源歸一化
22 b = b.clip(0, 255)
23 
24 im = Image.fromarray(b.astype('uint8'))                    # 重構圖像
25 im.save(r'C:\Users\jian12.guo\Desktop\tupian\mingren1.jpeg')

代碼講解

1.我們來觀察一下L矩陣,可以看出第4行 a是一個二維浮點型矩陣,因此它的梯度grad里應該有兩個數組矩陣,分別對應兩層維度的梯度。現取最外層維度梯度為x方向的梯度值grad_x,取第二層維度梯度值為y方向梯度值grad_y

grad_x, grad_y = grad

2.這時我們已經取得了圖像的梯度值,就可以通過改變像素的梯度值來改變圖像的灰度變化,對圖像進行重構了。我們先設一個深度值depth,取值范圍為(0,100),然后利用深度調整x和y方向的梯度值。

深度值越小,重構后的圖像梯度值越小,即圖像灰度值變化越小,畫面線條越少,整體更顯潔凈。

grad_x = grad_x * depth / 100.
grad_y = grad_y * depth / 100.

3.制造光源效果:類似版畫的效果,這是因為此時的圖像還沒有光源效果,跟我們實際觀察事物的感覺不一樣,因此我們還需要為圖像制造光源效果。如圖,我們先假設一個光源位於圖像斜上方,設俯視角為el,方位角為az,則單位光線在x,y,z方向上的投影長度分別為:通過多次調整發現,當俯視角el=π/2.2, 方位角az=π/4時光照效果最好。(當然對於不同圖像兩個角度的選取不一定相同)

實現代碼參考:第5行~第21行
 
4.重構圖像:由於灰度值的選取范圍為(0,255),為了避免數據越界,需要將生成的灰度值裁剪至0-255之間
b = b.clip(0, 255)

由新的灰度值重構圖像

im = Image.fromarray(b.astype('uint8'))

其中uint8是一種數據類型。這時圖像的手繪化效果已經完成了。

 

參考鏈接:https://www.jianshu.com/p/dae4032a86a4

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM