數據分析與展示——圖像手繪效果實現

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章