Python實現(xiàn)圖像手繪效果的方法詳解
圖像的數(shù)組表示
圖像的RGB色彩模式
圖像一般使用RGB色彩模式,即每個像素點的顏色由紅(R)、綠(G)、藍(B)組成。
RGB三個顏色通道的變化和疊加得到各種顏色,其中
- R 紅色,取值范圍,0‐255
- G 綠色,取值范圍,0‐255
- B 藍色,取值范圍,0‐255
RGB形成的顏色包括了人類視力所能感知的所有顏色。
PIL庫
PIL——Python Image Library
PIL庫是一個具有強大圖像處理能力的第三方庫 在命令行下的安裝方法:
#安裝 pip install pillow #引入包 from PIL import Image
Image是PIL庫中代表一個圖像的類(對象)。
圖像組成
圖像是一個由像素組成的二維矩陣,每個元素是一個RGB值,它是(R,G,B)。圖像是一個三維數(shù)組,維度分別是高度、寬度和像素RGB值。
from PIL import Image import numpy as np im=np.array(Image.open("beijing.jpg")) print(im.shape,im.dtype)
它的輸出是
(669, 1012, 3) uint8
圖像的變換
我們將會完成在讀入圖像后,獲得像素RGB值,修改后保存為新的文件。
讓我們先來看看對每個像素形成互補的圖像:
from PIL import Image import numpy as np a=np.array(Image.open("beijing.jpg")) b=[255,255,255]-a im=Image.fromarray(b.astype("uint8")) im.save('./new.jpg')
再來看看圖像進行灰度處理后,剩下兩個通道。
from PIL import Image import numpy as np a=np.array(Image.open("beijing.jpg").convert("L")) b=255-a im=Image.fromarray(b.astype("uint8")) im.save('./new.jpg')
灰度圖像后的區(qū)間變換
from PIL import Image import numpy as np a=np.array(Image.open("beijing.jpg").convert("L")) b=(100/255)*a+150 im=Image.fromarray(b.astype("uint8")) im.save('./new.jpg')
灰度圖像后的像素平方
from PIL import Image import numpy as np a=np.array(Image.open("beijing.jpg").convert("L")) b=255*(a/255)**2 im=Image.fromarray(b.astype("uint8")) im.save('./new.jpg')
那大家也看到了,我們只需要對其b進行修改即可。
圖像的手繪效果
手繪效果展示
手繪效果的幾個特征:
- 黑白灰色
- 邊界線條較重
- 相同或相近色彩趨于白色
- 略有光源效果
代碼展示與講解
from PIL import Image import numpy as np a = np.asarray(Image.open('./beijing.jpg').convert('L')).astype('float') depth = 10. # (0-100) grad = np.gradient(a) #取圖像灰度的梯度值 grad_x, grad_y = grad #分別取橫縱圖像梯度值 grad_x = grad_x*depth/100. grad_y = grad_y*depth/100. A = np.sqrt(grad_x**2 + grad_y**2 + 1.) uni_x = grad_x/A uni_y = grad_y/A uni_z = 1./A 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 軸的影響 b = 255*(dx*uni_x + dy*uni_y + dz*uni_z) #光源歸一化 b = b.clip(0,255) im = Image.fromarray(b.astype('uint8')) #重構(gòu)圖像 im.save('./beijingHD.jpg')
梯度的重構(gòu)
利用像素之間的梯度值和虛擬深度值對圖像進行重構(gòu),根據(jù)灰度變化來模擬人類視覺的遠近程度。
depth = 10. grad = np.gradient(a) grad_x, grad_y = grad grad_x = grad_x*depth/100. grad_y = grad_y*depth/100.
depth預設深度值為10,其取值范圍0‐100,再提取x和y方向的梯度值,根據(jù)深度調(diào)整x和y方向的梯度值。
光源效果
根據(jù)灰度變化來模擬人類視覺的遠近程度。
- 設計一個位于圖像斜上方的虛擬光源
- 光源相對于圖像的俯視角為Elevation,方位角為Azimuth
- 建立光源對個點梯度值的影響函數(shù)
- 運算出各點的新像素值
vec_el = np.pi/2.2 vec_az = np.pi/4. dx = np.cos(vec_el)*np.cos(vec_az) dy = np.cos(vec_el)*np.sin(vec_az) dz = np.sin(vec_el)
np.cos(vec_el)為單位光線在地平面上的投影長度,dx, dy, dz是光源對x/y/z三方向的影響程度。
梯度歸一化
A = np.sqrt(grad_x**2 + grad_y**2 + 1.) uni_x = grad_x/A uni_y = grad_y/A uni_z = 1./A b = 255*(dx*uni_x + dy*uni_y + dz*uni_z)
A是構(gòu)造x和y軸梯度的三維歸一化單位坐標系,然后梯度與光源相互作用,將梯度轉(zhuǎn)化為灰度
圖像生成
b = b.clip(0,255) im = Image.fromarray(b.astype('uint8')) #重構(gòu)圖像 im.save('./beijingHD.jpg')
在這里,為避免數(shù)據(jù)越界,將生成的灰度值裁剪至0‐255區(qū)間
到此這篇關(guān)于Python實現(xiàn)圖像手繪效果的方法詳解的文章就介紹到這了,更多相關(guān)Python圖像手繪內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python網(wǎng)絡編程之TCP與UDP協(xié)議套接字用法示例
這篇文章主要介紹了Python網(wǎng)絡編程之TCP與UDP協(xié)議套接字用法,結(jié)合實例形式較為詳細的分析了Python網(wǎng)絡編程中TCP與UDP協(xié)議客戶端、服務器端相關(guān)實現(xiàn)及使用技巧,需要的朋友可以參考下2018-02-02python實現(xiàn)去掉字符串中的\xa0、\t、\n
這篇文章主要介紹了python實現(xiàn)去掉字符串中的\xa0、\t、\n方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08關(guān)于python3?opencv?圖像二值化的問題(cv2.adaptiveThreshold函數(shù))
這篇文章主要介紹了python3?opencv?圖像二值化cv2.adaptiveThreshold函數(shù)的相關(guān)知識,結(jié)合示例代碼介紹了adaptiveThreshold方法的用法,需要的朋友可以參考下2022-04-04PyTorch搭建LSTM實現(xiàn)多變量多步長時序負荷預測
這篇文章主要為大家介紹了PyTorch搭建LSTM實現(xiàn)多變量多步長時序負荷預測,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05