Like Share Discussion Bookmark Smile

J.J. Huang   2026-01-16   Python OpenCV 03.圖片處理篇:基礎技巧   瀏覽次數:次   DMCA.com Protection Status

Python | OpenCV 圖片縮放、旋轉與翻轉

📚 前言

在前面我們學會了如何進行 灰階化與色彩空間轉換
這一篇要進一步學習 圖片縮放、旋轉與翻轉,這些都是影像幾何操作的基礎技巧,常用於影像前處理、資料增強 (Data Augmentation) 與特徵分析。

🔍 基本概念

  • 縮放 (Resize):改變圖片大小,可依比例或指定解析度
  • 旋轉 (Rotate):以指定角度旋轉圖片。
  • 翻轉 (Flip):水平或垂直翻轉圖片。

💻 範例程式:圖片縮放

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import cv2

img = cv2.imread("test.png")

# 縮小到 50%
small = cv2.resize(img, None, fx=0.5, fy=0.5)

# 放大到 2 倍
large = cv2.resize(img, None, fx=2, fy=2)

# 指定解析度縮放
fixed = cv2.resize(img, (640, 480))

cv2.imshow("Original", img)
cv2.imshow("Small", small)
cv2.imshow("Large", large)
cv2.imshow("Fixed", fixed)
cv2.waitKey(0)
cv2.destroyAllWindows()


圖:圖片縮放示例

🔄 範例程式:圖片旋轉

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import cv2

img = cv2.imread("test.png")

# 取得圖片中心
(h, w) = img.shape[:2]
center = (w // 2, h // 2)

# 旋轉 45 度,縮放比例 1.0
M = cv2.getRotationMatrix2D(center, 45, 1.0)
rotated = cv2.warpAffine(img, M, (w, h))

cv2.imshow("Original", img)
cv2.imshow("Rotated", rotated)
cv2.waitKey(0)
cv2.destroyAllWindows()


圖:圖片旋轉示例

📌 補充:cv2.rotate()cv2.getRotationMatrix2D() 的差異

在 OpenCV 裡有兩種常見的旋轉方式:

1. cv2.rotate()

  • 用途:快速旋轉圖片到 固定角度
  • 支援角度:90° 順時針、90° 逆時針、180°。
  • 優點:簡單、快速,程式碼短。
  • 缺點:只能做固定角度旋轉,無法指定任意角度。
1
2
rot90 = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)
rot180 = cv2.rotate(img, cv2.ROTATE_180)

2. cv2.getRotationMatrix2D() + cv2.warpAffine()

  • 用途:旋轉圖片到 任意角度,並可同時縮放。
  • 支援角度:任意角度(例如 30°、45°、120°)。
  • 優點:彈性大,可以做精確控制。
  • 缺點:程式碼稍微複雜,需要計算旋轉矩陣。
1
2
3
4
(h, w) = img.shape[:2]
center = (w // 2, h // 2)
M = cv2.getRotationMatrix2D(center, 45, 1.0)
rot45 = cv2.warpAffine(img, M, (w, h))

🧩 差異比較表

方法 可旋轉角度 是否可縮放 適合情境
cv2.rotate() 固定角度 (90°, 180°) 快速旋轉到標準角度
getRotationMatrix2D + warpAffine 任意角度 需要精確控制角度或縮放

📌 補充:為什麼沒有提到 transpose?

  • cv2.transpose() 是矩陣轉置操作,效果看起來像是「順時針旋轉 90°」,但本質是沿主對角線翻轉,並且寬高互換。
  • 在基礎篇章裡,常見的操作是 resize、rotate、flip,所以沒有特別放進主要章節。
1
2
3
# transpose 範例
transposed = cv2.transpose(img)
rot90 = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)

🔃 範例程式:圖片翻轉

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import cv2

img = cv2.imread("test.png")

# 水平翻轉
flip_horizontal = cv2.flip(img, 1)

# 垂直翻轉
flip_vertical = cv2.flip(img, 0)

# 水平 + 垂直翻轉
flip_both = cv2.flip(img, -1)

cv2.imshow("Original", img)
cv2.imshow("Horizontal Flip", flip_horizontal)
cv2.imshow("Vertical Flip", flip_vertical)
cv2.imshow("Both Flip", flip_both)
cv2.waitKey(0)
cv2.destroyAllWindows()


圖:圖片翻轉示例

⚠️ 注意事項

  • 縮放插值方式cv2.resize() 預設使用雙線性插值,若需更高品質可用 cv2.INTER_CUBICcv2.INTER_LANCZOS4
  • 旋轉後邊界問題:旋轉可能造成圖片邊界裁切,可調整輸出大小避免。
  • 翻轉用途:常用於資料增強 (Data Augmentation),增加訓練樣本多樣性。
  • transpose 補充:屬於矩陣操作,效果類似旋轉 90°,但和 cv2.rotate() 本質不同。

🎯 結語

這一篇我們學會了如何進行 圖片縮放、旋轉與翻轉,並且釐清了不同旋轉方法 (cv2.rotatecv2.getRotationMatrix2D) 的差異,以及為什麼 transpose 沒有放在主要章節。這些幾何操作是影像處理的基礎,能幫助我們靈活調整圖片大小與方向。

在下一篇,我們將進一步學習 區域裁切與 ROI (Region of Interest) 應用,掌握如何針對影像中的特定區域進行操作,這在物件偵測、特徵分析與資料前處理中非常重要。

📖 如在學習過程中遇到疑問,或是想了解更多相關主題,建議回顧一下 Python | OpenCV 系列導讀,掌握完整的章節目錄,方便快速找到你需要的內容。


註:以上參考了
OpenCV Tutorials
OpenCV-Python Tutorials