圖像的數組表示、變換,圖片的手繪效果

圖像的RGB色彩模式

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

RGB三個顏色通道的變化和疊加得到各種顏色,其中紅綠藍的取值範圍都是0-255

PIL庫

Python Image Library,一個具有強大圖像處理能力的第三方庫。(pip install pillow)

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

圖像的數組表示

圖像:由像素組成的二維矩陣,每個元素是一個RGB值。

from PIL import Image
import numpy as np
im=np.array(Image.open("E:/pic.jpg"))
print(im.shape, im.dtype)   # 圖像形狀(高度,寬度,像素的RGB值)

#輸出結果:(286, 510, 3) uint8  # 意味着RGB分別由一個uint8表示

 

圖像的變換

基本流程:讀入圖像,獲得像素RGB值,修改後保存爲新的圖片

from PIL import Image
import numpy as np

a=np.array(Image.open("E:/pic.jpg"))#讀入圖像,獲得像素RGB值
print(a.shape, a.dtype)

b=[255,255,255]-a #變換爲色彩是a補集的RGB數組

im=Image.fromarray(b.astype('uint8')) #將數組b生成新的圖像對象

im.save("E:/pic1.jpg")# 將新圖像保存

輸出圖像如下:

pic1

變換爲灰度值圖片:

from PIL import Image
import numpy as np

a=np.array(Image.open("E:/pic.jpg"))#讀入圖像,獲得像素RGB值
print(a.shape, a.dtype)


b=255-a #變換爲色彩是a補集的RGB數組

im=Image.fromarray(b.astype('uint8')) 

im.save("E:/pic2.jpg")# 將新圖像保存

輸出圖像如下:

pic2

其他變換:

from PIL import Image
import numpy as np

a=np.array(Image.open("E:/pic.jpg"))#讀入圖像,獲得像素RGB值
print(a.shape, a.dtype)

c=(100/255)*a+150 #區間變換
d=255*(a/255)**2  #像素平方

im3=Image.fromarray(c.astype('uint8'))
im4=Image.fromarray(d.astype('uint8'))

im3.save("E:/pic3.jpg")# 將新圖像保存
im4.save("E:/pic4.jpg")# 將新圖像保存

 輸出:

pic3
pic4

圖片的手繪效果

from PIL import Image
import numpy as np

a = np.asarray(Image.open('E:/mode.jpg').convert('L')).astype('float')

depth = 10.                                  #預設深度值10,(0-100)
#根據灰度變化模擬人類視覺的明暗程度
grad = np.gradient(a)                        #取圖像灰度的梯度值
grad_x, grad_y = grad                        #分別取橫縱座標梯度值
grad_x = grad_x*depth/100.
grad_y = grad_y*depth/100.
#構造x和y軸梯度的三維歸一化單位座標系
A = np.sqrt(grad_x**2 + grad_y**2 + 1.)
unit_x = grad_x/A
unit_y = grad_y/A
unit_z = 1./A

vec_a1 = np.pi/2.2                            #光源的俯視角度,弧度值
vec_a2 = np.pi/4.                             #光源的方位角度,弧度值
#np.cos(vec_a1)爲單位光線在地面上的投影長度
dx = np.cos(vec_a1)*np.cos(vec_a2)            #光源對x軸影響
dy = np.cos(vec_a1)*np.sin(vec_a2)            #光源對y軸影響
dz = np.sin(vec_a1)                           #光源對z軸影響

b = 255*(dx*unit_x + dy*unit_y + dz*unit_z)   #光源歸一化,光源與梯度相互作用,將梯度轉化爲灰度
b = b.clip(0, 255)                            #爲避免數據越界,將生成的灰度值裁剪至0-255區間

im = Image.fromarray(b.astype('uint8'))       #重構圖像
im.save("E:/mode1.jpg")                       #將新圖像保存
mode
mode1

 

 

教程參考:https://www.bilibili.com/video/av81400128?p=20

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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