日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python 数据分析与展示笔记2 -- 图像手绘效果

發(fā)布時間:2025/3/12 python 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python 数据分析与展示笔记2 -- 图像手绘效果 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Python 數(shù)據(jù)分析與展示筆記2 – 圖像手繪效果


Python 數(shù)據(jù)分析與展示系列筆記是筆者學(xué)習(xí)、實踐Python 數(shù)據(jù)分析與展示的相關(guān)筆記

課程鏈接: Python 數(shù)據(jù)分析與展示

參考文檔:
Numpy 官方文檔(英文)
Numpy 官方文檔(中文)
PIL 官方文檔


一、PIL 庫


1、安裝與導(dǎo)入

# 安裝 PIL 庫 pip install pillow# 導(dǎo)入 PIL 庫 import PIL# 導(dǎo)入 PIL 庫的 Image模塊/類(用讀取顯示圖像) from PIL import Image

2、簡單使用

# 打開圖像 Image.open('圖片的路徑')# 轉(zhuǎn)為灰度圖像 .convert('L')# 保存圖像 .save('保存路徑')

二、圖像手繪效果


1、總體思路

  • 圖像中物體的邊緣用黑色畫出,而大片相同的區(qū)域用白色畫出
  • 圖像梯度可以求出物體的邊緣,邊緣越明顯,梯度越大
  • 為了用黑色表色邊緣,圖片的像素值應(yīng)該與梯度值成反比關(guān)系,而代碼中的核心思想也是為了求得這個關(guān)系

2、幾點理解

  • depth參數(shù):設(shè)置 x,y 梯度占總的梯度的比例,使梯度值縮小,因為我們把z向的梯度設(shè)成了1,如果不壓縮x,y向梯度那么這個1就起不到什么作用
  • z 方向的梯度(即梯度歸一化中的1):為了表示像素值與梯度的反比關(guān)系,當像素的 x,y 向梯度值都很小時,在歸一化時uni_z值就會區(qū)于1從而得到趨于255的像素值
  • 圖像梯度歸一化:主要為了得到 uni_z 的值
  • 光源設(shè)置:設(shè)置光源的角度只是為了得到 dx,dy,dz 三個可調(diào)系數(shù)而已,個人認為跟光源一點關(guān)系都沒有,反而不好理解
  • dx,dy,dz:uni_x,uni_y,uni_z的系數(shù),更深入的說其實目的是把 dz 設(shè)的很大,dx,dy很小,完全可以不要dx,dy 把dz設(shè)為1,效果幾乎一樣

3、代碼

from PIL import Image import numpy as npdef hand_draw_image(img_path, show=True, save_path=None):"""把彩色圖片變?yōu)槭掷L風(fēng)格的灰度圖片:param img_path: 原圖片的路徑:param show: 是否要顯示手繪圖片:param save_path: 是否要保存手繪圖片:return:"""# 打開圖片轉(zhuǎn)為灰度圖,并轉(zhuǎn)換為 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)) # 重構(gòu)圖像if show:im.show()if save_path:im.save(save_path)if __name__ == '__main__':print('running hand_painted:')hand_draw_image('圖片路徑')

原圖:

效果:


GOOD LUCK!


總結(jié)

以上是生活随笔為你收集整理的Python 数据分析与展示笔记2 -- 图像手绘效果的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。