Skip to content

影像座標系簡介

在影像處理中,影像是一個 2D 像素矩陣,每個像素都有一個對應的 座標 (x, y),我們稱之為 影像座標系(Image Coordinate System)


✅ 1. 影像座標系的基本規則

在大多數影像處理函式庫(如 OpenCV、Pillow、scikit-image)中,影像的座標系與數學坐標系不同:

  1. (0,0) 原點位於左上角
  2. x 軸向右遞增
  3. y 軸向下遞增

🔹 影像座標示意圖

(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}")

🔹 輸出範例

影像寬度: 1920, 影像高度: 1080, 色彩通道: 3

OpenCV 的 shape 格式為 (H, W, C)(高度, 寬度, 通道數)


🔹 Pillow

from PIL import Image

img = Image.open("example.jpg")  # 讀取圖片
width, height = img.size  # Pillow 讀取方式
print(f"影像寬度: {width}, 影像高度: {height}")

🔹 輸出範例

影像寬度: 1920, 影像高度: 1080

Pillow 的 size 格式為 (W, H)(寬度, 高度),與 OpenCV 相反!


✅ 4. 影像中某個像素的座標

如果你想 獲取某個像素的顏色值,可以使用:

🔹 OpenCV

pixel = img[100, 200]  # 取 y=100, x=200 的像素值
print(pixel)  # [B, G, R]

OpenCV 預設是 BGR(藍、綠、紅),而不是 RGB!

🔹 Pillow

pixel = img.getpixel((200, 100))  # Pillow 需要 (x, y)
print(pixel)  # (R, G, B)

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 裁剪範例

cropped = img.crop((50, 50, 200, 200))  # (x1, y1, x2, y2)
cropped.show()

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 適合高效影像處理與電腦視覺應用! 😊