NumPy庫入門
NumPy數據存取和函數
實例:圖像的數組表示
圖像的RGB色彩模式
圖像一般使用RGB色彩模式,即每個像素點的顏色由紅(R)、綠(G)、藍(B)組成。
RGB三個顏色通道的變化和疊加得到各種顏色,取值都爲0-255。RGB形成的顏色包括了人類視力所能感知的所有顏色。
PIL(Python Image Library)庫
PIL庫是一個具有強大圖像處理能力的第三方庫。在命令行下的安裝方法:pip install pillow
from PIL import Image
Image是PIL庫中代表一個圖像的類(對象)
圖像是一個由像素組成的二維矩陣,每個元素是一個RGB值。
範例:將數組轉化爲ndarray數組
In [1]: from PIL import Image In [2]: import numpy as np In [3]: im = np.array(Image.open("E:/tiger.jpg")) In [4]: print(im.shape,im.dtype) (435, 428, 3) uint8
圖像是一個三維數組,維度分別是高度、寬度和像素RGB值。
圖像的變換
讀入圖像後,獲得像素RGB值,修改後保存爲新的文件。
範例:修改圖像並另存
In [5]: b = [255,255,255] - im In [6]: new_im = Image.fromarray(b.astype('uint8')) In [7]: new_im.save("E:/tiger1.jpg") In [8]: a = np.array(Image.open("E:/tiger.jpg").convert('L')) # 使用灰度表示圖像 In [9]: b = 255 - a In [10]: im = Image.fromarray(b.astype('uint8')) In [11]: im.save("E:/tiger2.jpg") In [12]: c = (100/255)*a +150 # 區間變換 In [13]: im = Image.fromarray(c.astype('uint8')) In [14]: im.save("E:/tiger3.jpg") In [15]: d = 255 * (a/255)**2 # 像素平方 In [16]: im = Image.fromarray(d.astype('uint8')) In [17]: im.save("E:/tiger4.jpg")
tiger.jpg tiger1.jpg tiger2.jpg tiger3.jpg tiger4.jpg
“圖像的手繪效果”實例分析
手繪效果特徵:
- 黑白灰色
- 邊界線條較重
- 相同或相近色彩趨於白色
- 略有光源效果
圖像手繪效果實現代碼:
from PIL import Image import numpy as np a = np.asarray(Image.open('E:/tiger.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')) # 重構圖像 im.save('E:/tiger0.jpg')
tiger0.jpg