圖像的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")# 將新圖像保存
輸出圖像如下:
變換爲灰度值圖片:
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")# 將新圖像保存
輸出圖像如下:
其他變換:
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")# 將新圖像保存
輸出:
圖片的手繪效果
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") #將新圖像保存
教程參考:https://www.bilibili.com/video/av81400128?p=20