影像座標系簡介
在影像處理中,影像是一個 2D 像素矩陣,每個像素都有一個對應的 座標 (x, y),我們稱之為 影像座標系(Image Coordinate System)。
✅ 1. 影像座標系的基本規則
在大多數影像處理函式庫(如 OpenCV、Pillow、scikit-image)中,影像的座標系與數學坐標系不同:
- (0,0) 原點位於左上角
- x 軸向右遞增
- y 軸向下遞增
🔹 影像座標示意圖
✅ 這與數學中的直角坐標系不同,數學坐標的 Y 軸是向上增加,而影像座標的 Y 軸是向下增加!
✅ 2. Pillow vs OpenCV 的寬度與高度差異
Pillow 和 OpenCV 都可以獲取影像的 寬度(width)與高度(height),但它們的 shape
格式不同:
函式庫 | 獲取方式 | 寬度順序 | 高度順序 |
---|---|---|---|
Pillow | img.size |
先寬度 (W),後高度 (H) | (W, H) |
OpenCV | img.shape |
先高度 (H),後寬度 (W) | (H, W, C) |
✅ 3. 如何獲取影像的尺寸
🔹 OpenCV
import cv2
img = cv2.imread("example.jpg") # 讀取圖片
height, width, channels = img.shape # OpenCV 讀取方式
print(f"影像寬度: {width}, 影像高度: {height}, 色彩通道: {channels}")
🔹 輸出範例
✅ OpenCV 的 shape
格式為 (H, W, C)
(高度, 寬度, 通道數)
🔹 Pillow
from PIL import Image
img = Image.open("example.jpg") # 讀取圖片
width, height = img.size # Pillow 讀取方式
print(f"影像寬度: {width}, 影像高度: {height}")
🔹 輸出範例
✅ Pillow 的 size
格式為 (W, H)
(寬度, 高度),與 OpenCV 相反!
✅ 4. 影像中某個像素的座標
如果你想 獲取某個像素的顏色值,可以使用:
🔹 OpenCV
✅ OpenCV 預設是 BGR(藍、綠、紅),而不是 RGB!
🔹 Pillow
✅ Pillow 預設是 RGB,與 OpenCV 的 BGR 不同!
✅ 5. 影像裁剪(座標範圍)
函式庫 | 座標格式 | 裁剪方式 |
---|---|---|
OpenCV | [y1:y2, x1:x2] |
cropped = img[50:200, 50:200] |
Pillow | (x1, y1, x2, y2) |
cropped = img.crop((50, 50, 200, 200)) |
🔹 OpenCV 裁剪範例
cropped = img[50:200, 50:200] # (y1:y2, x1:x2)
cv2.imshow("Cropped", cropped)
cv2.waitKey(0)
cv2.destroyAllWindows()
🔹 Pillow 裁剪範例
✅ Pillow 裁剪的順序是 (x1, y1, x2, y2)
,而 OpenCV 是 [y1:y2, x1:x2]
,兩者順序不同!
📌 總結
函式庫 | 獲取寬高方式 | 尺寸順序 | 座標格式 | 像素存取 | 色彩通道 |
---|---|---|---|---|---|
Pillow | img.size |
(W, H) |
(x1, y1, x2, y2) |
img.getpixel((x, y)) |
RGB |
OpenCV | img.shape |
(H, W, C) |
[y1:y2, x1:x2] |
img[y, x] |
BGR |
🚀 Pillow 適合簡單影像處理(如縮放、裁剪、格式轉換),OpenCV 適合高效影像處理與電腦視覺應用! 😊