取得影像資訊
這篇教學會介紹使用 OpenCV,取得影像的長寬尺寸、以及讀取影像中某些像素的顏色數值。
因為程式中的 OpenCV 會需要使用鏡頭或 GPU,所以請使用本機環境 ( 參考:使用 Python 虛擬環境 ) 或使用 Anaconda Jupyter 進行實作 ( 參考:使用 Anaconda ) ,並安裝 OpenCV 函式庫 ( 參考:OpenCV 函式庫 )。
快速導覽:
shape 取得長寬與色版數量
使用 OpenCV 的 imread() 方法讀取的影像後,透過 shape 屬性,能取得影像的寬、長和色版數量,通常色版數量 ( 色彩通道 ) 會由 R、G、B 色光三原色組成,如果影像不具有三個色版,則只會取得寬與長。
import cv2
img = cv2.imread('meme.jpg')
print(img.shape) # 得到 (360, 480, 3)
cv2.imshow('oxxostudio', img)
cv2.waitKey(0) # 按下任意鍵停止
cv2.destroyAllWindows()
size 取得像素總數
使用 OpenCV 的 imread() 方法讀取的影像後,透過 size 屬性,能取得影像的像素總數,像素總數為「寬 x 長 x 色版數量」。
import cv2
img = cv2.imread('meme.jpg')
print(img.size) # 518400 ( 360x480x3 )
cv2.imshow('oxxostudio', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
dtype 取得數據類型
使用 OpenCV 的 imread() 方法讀取的影像後,透過 dtype 屬性,能取得影像的數據類型。
import cv2
img = cv2.imread('meme.jpg')
print(img.dtype) # uint8
cv2.imshow('oxxostudio', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
取得每個像素的色彩資訊
使用 OpenCV 的 imread() 方法讀取的影像後,可以印出圖片的「三維陣列」資訊,以下方的程式碼為例,可以印出一張 4x4 的圖片陣列,可以看到每一個像素都有 B、G、R 三個顏色資訊,顏色範圍均是 0~255 ( 範例圖片將 4x4 放大,比較容易理解 )。
import cv2
img = cv2.imread('meme-test.png')
print(img)
cv2.imshow('oxxostudio', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
了解原理後,也可以使用變數來裝載圖片的色彩資訊。
import cv2
img = cv2.imread('meme-test.png')
b, g, r = cv2.split(img)
print(b)
print(g)
print(r)
cv2.imshow('oxxostudio', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
既然能取得圖片的每個像素資訊,就能針對這些像素進行修改,舉例來說,透過陣列切片賦值的方法,就能將一張去除圖片中的紅色、綠色或藍色。
import cv2
img_blue = cv2.imread('meme.jpg')
img_green = cv2.imread('meme.jpg')
img_red = cv2.imread('meme.jpg')
img_blue[:,:,1] = 0 # 將綠色設為 0
img_blue[:,:,2] = 0 # 將紅色設為 0
img_green[:,:,0] = 0 # 將藍色設為 0
img_green[:,:,2] = 0 # 將紅色設為 0
img_red[:,:,0] = 0 # 將藍色設為 0
img_red[:,:,1] = 0 # 將綠色設為 0
cv2.imshow('oxxostudio blue', img_blue)
cv2.imshow('oxxostudio green', img_green)
cv2.imshow('oxxostudio red', img_red)
cv2.waitKey(0)
cv2.destroyAllWindows()
參考資料
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~