OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺和影像處理庫,它提供了豐富的功能和工具,可用於開發各種視覺應用程式。
OpenCV最初是用C++編寫的,但它也提供了Python、Java等多種程式語言的接口,方便不同語言的開發者使用。
OpenCV影像基礎介紹
- 影像的表示:
- OpenCV中的影像是以NumPy陣列的形式表示的,可以是二維(灰度影像)或三維(彩色影像)。對於彩色影像,通常使用BGR通道,即藍色(Blue)、綠色(Green)、紅色(Red)。
- 色彩通道:
- 彩色影像中,每個像素都有三個色彩通道,分別對應著紅、綠、藍三個顏色。
- OpenCV使用BGR順序,這表示像素的數據順序為藍色值、綠色值和紅色值。
- 影像坐標系:
- 影像是以NumPy的多維陣列(ndarray)形式表示的。
- 陣列的維度是 (rows, columns),其中 rows 表示影像的高度,columns 表示影像的寬度。
- 透過座標 (y, x) 或 (row, column) 來訪問它的值,通常我們習慣使用 (x, y) 表示座標。

程式範例
使用OpenCV和NumPy創建一個大小為160x280灰度影像,然後顯示圖像。import cv2
import numpy as np
height = 160 # 影像高
width = 280 # 影像寬
# 建立GRAY影像陣列
image = np.zeros((height, width), np.uint8)
cv2.imshow("image", image) # 顯示影像
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
:這是引入OpenCV庫的語句。import numpy as np
:這是引入NumPy庫的語句,通常使用np
作為別名。height = 160
和width = 280
:這兩行代碼定義了影像的高度和寬度。image = np.zeros((height, width), np.uint8)
:這一行創建了一個高度為160,寬度為280的灰度影像。np.zeros
函數創建一個全為零的NumPy陣列,並指定了影像的型別為np.uint8
(8位元的無符號整數,範圍為0到255)。cv2.imshow("image", image)
:這一行使用OpenCV的cv2.imshow
函數顯示影像。第一個參數是視窗的名稱,第二個參數是要顯示的影像。cv2.waitKey(0)
:這一行等待用戶按下任意按鍵。0
表示無限等待,直到按下按鍵為止。cv2.destroyAllWindows()
:這一行用於關閉所有打開的視窗。

程式輸出圖
在影像的坐標系中跟常見的笛卡兒坐標系不同,(0, 0)是從左上角開始,沒有負值。
我們印出圖像的資訊看看長什麼樣子吧。
image.shape
: 查看圖像形狀。
形狀為160x280灰度影像,這個陣列的所有元素都是 0,這表示整個影像是全黑的。
在灰階影像中,數值0為黑色,數值255為白色。
print(f'image size {image.shape}')
print(image)

圖像資訊
使用 NumPy 的 np.linspace
函數來創建一個漸變從黑到白的灰度影像。
使用 np.linspace(0, 255, width, dtype=np.uint8)
來創建一個灰度值的漸變,然後使用 np.tile
將這個漸變複製到整個影像的高度。
# 創建灰度漸變影像
gradient_image = np.linspace(0, 255, width, dtype=np.uint8)
gradient_image = np.tile(gradient_image, (height, 1))
最後呈現由黑到白的灰度影像,來理解圖像資訊的數值 0~255的概念。

從黑到白的灰度影像