圖像的數組表示
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 • 建立光源對個點梯度值的影響函數 • 運算出各點的新像素值 如圖  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 官網手冊。
手繪效果圖:
