資料型態差異
初學者建議
初學者需要注意三個套件讀圖後存成什麼樣的資料型態!這個很重要!很重要!很重要!
不同的影像處理套件在讀取圖片時,資料型態有所不同,主要差異在於:
- 數據類型(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 ) |
📌 主要差異
-
Pillow (
Image.open()
)- 讀取後的影像是 PIL.Image 物件,需要
np.array()
轉換成 NumPy 陣列。 - 預設使用 RGB 色彩通道(可轉換
RGBA
含透明度)。 - 數據範圍是 0~255,格式為
uint8
。
- 讀取後的影像是 PIL.Image 物件,需要
-
Scikit-Image (
io.imread()
)- 讀取後 直接是 NumPy 陣列(不需要額外轉換)。
- 預設使用 RGB 色彩通道,與 Pillow 相同。
- 數據範圍是 0~1(
float64
),適合影像處理與機器學習。
-
OpenCV (
cv2.imread()
)- 讀取後也是 NumPy 陣列,但色彩順序是 BGR 而不是 RGB。
- 數據範圍是 0~255(
uint8
),與 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 才能與其他工具兼容。