天天看點

python 實作圖像的手繪效果

圖像的數組表示

1、圖像一般使用RGB色彩模式,即每個像素點的顔色由紅(R)、綠(G)、藍(B)組成。

RGB三個顔色通道的變化和疊加得到各種顔色,其中

• R 紅色,取值範圍,0‐255

• G 綠色,取值範圍,0‐255

• B 藍色,取值範圍,0‐255

RGB形成的顔色包括了人類視力所能感覺的所有顔色。

PIL, Python Image Library

PIL庫是一個具有強大圖像處理能力的第三方庫

在指令行下的安裝方法:

pip install pillow
           

2、圖像是一個由像素組成的二維矩陣,每個元素是一個(R,G,B)值。

3、圖像是一個三維數組,次元分别是高度、寬度和像素RGB值

from PIL import Image
#Image是PIL庫中代表一個圖像的類(對象)

import numpy as np
im = np.array(Image.open("F:\PycharmProjects\dog.png"))


print(im.shape, im.dtype)    #圖像是一個三維數組,次元分别是高度、寬度和像素RGB值

           

輸出結果:

一些概念

圖像深度值: > 圖像深度是指存儲每個像素所用的位數,也用于量度圖像的色彩分辨率。 圖像梯度: >**梯度**的本意是一個向量(矢量),表示某一函數在該點處的方向導數沿着該方向取得最大值,即函數在該點處沿着該方向(此梯度的方向)變化最快,變化率最大(為該梯度的模)。 >>**圖像梯度**可以把圖像看成**二維離散函數**,圖像梯度其實就是這個二維離散函數的求導: 圖像梯度: G(x,y) = dx(i,j) + dy(i,j); dx(i,j) = I(i+1,j) - I(i,j); dy(i,j) = I(i,j+1) - I(i,j); 其中,I是圖像像素的值(如:RGB值),(i,j)為像素的坐标。 圖像梯度一般也可以用中值差分: dx(i,j) = [I(i+1,j) - I(i-1,j)]/2; dy(i,j) = [I(i,j+1) - I(i,j-1)]/2; 圖像邊緣一般都是通過對圖像進行梯度運算來實作的。 灰階: >灰階使用黑色調表示物體,即用黑色為基準色,不同的飽和度的黑色來顯示圖像。 每個灰階對象都具有從 0%(白色)到100%(黑色)的亮度值。 圖像的手繪效果實作 1、手繪效果的幾個特征: • 黑白灰色 • 邊界線條較重 • 相同或相近色彩趨于白色 • 略有光源效果 2、利用像素之間的梯度值和虛拟深度值對圖像進行重構,根據灰階變化來模拟人類視覺的遠近程度 3、考慮光源效果,根據灰階變化來模拟人類視覺的遠近程度 • 設計一個位于圖像斜上方的虛拟光源 • 光源相對于圖像的俯視角為Elevation,方位角為Azimuth • 建立光源對個點梯度值的影響函數 • 運算出各點的新像素值 如圖 ![光源模型](https://img-blog.csdn.net/20171126231357951?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzI4MTE0ODk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 4、實作代碼

from PIL import Image
#image 是 PIL庫中代表一個圖像的類
import numpy as np

#打開一張圖檔 “F:\PycharmProjects\cui.jpg” 是圖檔位置
a = np.asarray(Image.open('F:\PycharmProjects\cui.jpg')
               .convert('L')).astype('float')


depth =                     #浮點數,預設深度值為10
grad = np.gradient(a)          #取圖像灰階的梯度值
grad_x,grad_y = grad           #分别取橫縱圖像的梯度值
grad_x = grad_x*depth/     #根據深度調整 x 和 y 方向的梯度值
grad_y = grad_y*depth/
A = np.sqrt(grad_x** + grad_y** +)      #構造x和y軸梯度的三維歸一化機關坐标系
uni_x = grad_x/A
uni_y = grad_y/A
uni_z = /A

vec_el = np.pi/                       #光源的俯視角度,弧度值
vec_az = np.pi/                        #光源的方位角度,弧度值
dx = np.cos(vec_el)*np.cos(vec_az)       #光源對 x 軸的影響,np.cos(vec_el)為機關光線在地平面上的投影長度
dy = np.cos(vec_el)*np.sin(vec_az)       #光源對 y 軸的影響
dz = np.sin(vec_el)                      #光源對 z 軸的影響

b = *(dx*uni_x + dy*uni_y + dz*uni_z)    #梯度與光源互相作用,将梯度轉化為灰階
b = b.clip(,)                          #為避免資料越界,将生成的灰階值裁剪至0‐255區間

im = Image.fromarray(b.astype('uint8'))     #重構圖像
im.save("F:\PycharmProjects\cui1.jpg")      #儲存圖檔的位址

           

解釋:

上述的代碼中,牽扯到較多函數的調用,對于函數的解釋可以參考 python 官網手冊。

手繪效果圖:

python 實作圖像的手繪效果
python 實作圖像的手繪效果