Python 数据分析与展示笔记2 -- 图像手绘效果
生活随笔
收集整理的這篇文章主要介紹了
Python 数据分析与展示笔记2 -- 图像手绘效果
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Python 數據分析與展示筆記2 – 圖像手繪效果
Python 數據分析與展示系列筆記是筆者學習、實踐Python 數據分析與展示的相關筆記
課程鏈接: Python 數據分析與展示
參考文檔:
Numpy 官方文檔(英文)
Numpy 官方文檔(中文)
PIL 官方文檔
一、PIL 庫
1、安裝與導入
# 安裝 PIL 庫 pip install pillow# 導入 PIL 庫 import PIL# 導入 PIL 庫的 Image模塊/類(用讀取顯示圖像) from PIL import Image2、簡單使用
# 打開圖像 Image.open('圖片的路徑')# 轉為灰度圖像 .convert('L')# 保存圖像 .save('保存路徑')二、圖像手繪效果
1、總體思路
- 圖像中物體的邊緣用黑色畫出,而大片相同的區域用白色畫出
- 圖像梯度可以求出物體的邊緣,邊緣越明顯,梯度越大
- 為了用黑色表色邊緣,圖片的像素值應該與梯度值成反比關系,而代碼中的核心思想也是為了求得這個關系
2、幾點理解
- depth參數:設置 x,y 梯度占總的梯度的比例,使梯度值縮小,因為我們把z向的梯度設成了1,如果不壓縮x,y向梯度那么這個1就起不到什么作用
- z 方向的梯度(即梯度歸一化中的1):為了表示像素值與梯度的反比關系,當像素的 x,y 向梯度值都很小時,在歸一化時uni_z值就會區于1從而得到趨于255的像素值
- 圖像梯度歸一化:主要為了得到 uni_z 的值
- 光源設置:設置光源的角度只是為了得到 dx,dy,dz 三個可調系數而已,個人認為跟光源一點關系都沒有,反而不好理解
- dx,dy,dz:uni_x,uni_y,uni_z的系數,更深入的說其實目的是把 dz 設的很大,dx,dy很小,完全可以不要dx,dy 把dz設為1,效果幾乎一樣
3、代碼
from PIL import Image import numpy as npdef hand_draw_image(img_path, show=True, save_path=None):"""把彩色圖片變為手繪風格的灰度圖片:param img_path: 原圖片的路徑:param show: 是否要顯示手繪圖片:param save_path: 是否要保存手繪圖片:return:"""# 打開圖片轉為灰度圖,并轉換為 float 類型的 ndarrayimg = np.asarray(Image.open(img_path).convert('L')).astype('float')# 求圖像的梯度depth = 10grad_x, grad_y = np.gradient(img)grad_x = grad_x * depth / 100.grad_y = grad_y * depth / 100.# 歸一化圖像的梯度img_grad = np.sqrt(grad_x ** 2 + grad_y ** 2 + 1)uni_x = grad_x / img_graduni_y = grad_y / img_graduni_z = 1 / img_grad# 光源對圖像明暗的影響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 軸的影響(投影)img_res = 255 * (dx * uni_x + dy * uni_y + dz * uni_z) # 光源歸一化img_res = img_res.clip(0, 255) # 裁剪0-255外的像素值im = Image.fromarray(img_res.astype(np.uint8)) # 重構圖像if show:im.show()if save_path:im.save(save_path)if __name__ == '__main__':print('running hand_painted:')hand_draw_image('圖片路徑')原圖:
效果:
GOOD LUCK!
總結
以上是生活随笔為你收集整理的Python 数据分析与展示笔记2 -- 图像手绘效果的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php byte stringbuffe
- 下一篇: Python 数据分析与展示笔记3 --