Skip to content

資料型態差異

初學者建議

初學者需要注意三個套件讀圖後存成什麼樣的資料型態!這個很重要!很重要!很重要!

不同的影像處理套件在讀取圖片時,資料型態有所不同,主要差異在於:

  • 數據類型(dtype):像素值是 uint8(0~255)還是 float64(0~1)
  • 維度(shape):是否包含 Alpha 通道(透明度)
  • 色彩順序(RGB/BGR):OpenCV 預設為 BGR,Pillow 與 scikit-image 預設為 RGB

📌 資料型態對比

套件 讀取函數 輸出類型 數據範圍 色彩通道順序 是否支援 Alpha(透明通道)
Pillow (PIL) Image.open("image.jpg") PIL.Image 物件 0~255 (uint8) RGB ✅ 支援(可轉換 RGBA
scikit-image io.imread("image.jpg") NumPy 陣列 (ndarray) 0~1 (float64) RGB ✅ 支援
OpenCV cv2.imread("image.jpg") NumPy 陣列 (ndarray) 0~255 (uint8) BGR ✅ 支援(cv2.IMREAD_UNCHANGED

📌 主要差異

  1. Pillow (Image.open())

    • 讀取後的影像是 PIL.Image 物件,需要 np.array() 轉換成 NumPy 陣列。
    • 預設使用 RGB 色彩通道(可轉換 RGBA 含透明度)。
    • 數據範圍是 0~255,格式為 uint8
  2. Scikit-Image (io.imread())

    • 讀取後 直接是 NumPy 陣列(不需要額外轉換)。
    • 預設使用 RGB 色彩通道,與 Pillow 相同。
    • 數據範圍是 0~1float64),適合影像處理與機器學習。
  3. OpenCV (cv2.imread())

    • 讀取後也是 NumPy 陣列,但色彩順序是 BGR 而不是 RGB。
    • 數據範圍是 0~255uint8),與 Pillow 相同。
    • 不會自動讀取 Alpha 通道(透明度),但可以使用 cv2.IMREAD_UNCHANGED 來包含透明度。

📌 資料型態轉換

如果要讓 三個套件的輸出保持一致,可以做以下處理:

🔹 Pillow 轉 NumPy 陣列

from PIL import Image
import numpy as np

img = Image.open("image.jpg")
img_np = np.array(img)  # 轉成 NumPy 陣列

🔹 Scikit-Image 轉 uint8(讓範圍變 0~255)

from skimage import io, img_as_ubyte

img = io.imread("image.jpg")  # 預設範圍 0~1
img_uint8 = img_as_ubyte(img)  # 轉換為 0~255

🔹 OpenCV 轉 RGB

import cv2

img_bgr = cv2.imread("image.jpg")  # BGR 格式
img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)  # 轉換為 RGB

📌 總結

  • 如果要統一處理的格式,建議使用 NumPy 陣列(RGB, uint8, 0~255),方便跨套件處理。
  • Pillow 適合基本影像處理(讀取、存檔),但通常需要轉換為 NumPy 陣列來計算。
  • scikit-image 適合科學影像處理(如過濾、特徵偵測),但數據範圍是 0~1,可能需要轉換。
  • OpenCV 適合高效能影像處理與電腦視覺應用,但預設是 BGR,需要轉換為 RGB 才能與其他工具兼容。