Numpy簡易教程——圖像的數組表示

Numpy簡易教程——圖像的數組表示

一.圖像的表示模式

圖像一般採用RGB三通道色彩模式,每個像素點由紅(R ),綠(G),藍(B)三色組成。
取值範圍爲:
R:0-255
G:0-255
B:0-255

三者疊加就可獲取到對應像素點的顏色,這種方式可以包含人眼可見的所有顏色,
因此使用廣泛

二.PIL庫的使用

1.PIL庫簡介與下載,導入

PIL:Python Image Libaray,是一個具有處理圖像的強大功能的第三方庫
下載命令:pip install pillow
導入使用Image對象的方式:From PIL import Image

2.圖像的數組表示

import numpy as np;
from PIL import Image;
#讀入數據並保存爲數組
a = np.array(Image.open("D:/Jupyter_NoteBook/1單神經元網絡/images/cat01.jpg"));
print(a.shape,a.dtype)

結果爲:(625, 500, 3) uint8
含義:625表示圖像高,500表示寬度,3表示RGB的值

3.圖像的變換

import numpy as np;
from PIL import Image;
#讀入數據並保存爲數組
a = np.array(Image.open("D:/Jupyter_NoteBook/1單神經元網絡/images/cat02.jpg"));
print(a.shape,a.dtype)
Im = Image.fromarray((255-a).astype("uint8"))#將a數組處理爲Image對象並返回
Im.save("D:/Jupyter_NoteBook/1單神經元網絡/images/stars-new.jpg")

原圖:
在這裏插入圖片描述
更改後的:
在這裏插入圖片描述
如果想得到灰色圖片可以採用convert函數

import numpy as np;
from PIL import Image;
#讀入數據並保存爲數組
a = np.array(Image.open("D:/Jupyter_NoteBook/1單神經元網絡/images/cat02.jpg").convert('L'));
print(a.shape,a.dtype)
Im = Image.fromarray((255-a).astype("uint8"))#將a數組處理爲Image對象並返回
Im.save("D:/Jupyter_NoteBook/1單神經元網絡/images/stars-new.jpg")

(437, 1200) uint8這個運行結果表明此時元素的值不在對應RGB值,而是一個灰度值
效果如下:
在這裏插入圖片描述
純黑白就是不用255減去即可:
在這裏插入圖片描述
當然上面這個比較淡,要想重色可以這樣:

import numpy as np;
from PIL import Image;
#讀入數據並保存爲數組
a = np.array(Image.open("D:/Jupyter_NoteBook/1單神經元網絡/images/cat02.jpg").convert('L'));
print(a.shape,a.dtype)
Im = Image.fromarray(((a/255)**2*255).astype("uint8"))#將a數組處理爲Image對象並返回
Im.save("D:/Jupyter_NoteBook/1單神經元網絡/images/stars-new.jpg")

效果如下:
在這裏插入圖片描述
下面我們實現手繪效果:
首先介紹手繪的幾個要素:
①黑白灰色
②邊界線條較重
③相同或相近色彩趨近白色
④略有光源效果
實際上我們的手繪風格是在獲取了灰度值數組後進行處理得到的
灰度值代表圖片的明暗,梯度代表圖片灰度的變化率,通過調整像素的梯度值
間接改變明暗變化,最後是立體效果值通過添加虛擬深度值來實現(這一步需要歸一化處理)


from PIL import Image
import numpy as np
a = np.asarray(Image.open("D:/Jupyter_NoteBook/1單神經元網絡/images/jack.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('jackson.jpg')

原圖:
在這裏插入圖片描述
效果圖:
在這裏插入圖片描述
上面這段代碼直接複製使用即可,原理比較複雜,涉及到一些比較專業的知識(其實我也不甚明白)

下一篇:Matplotlib入門教程

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