OpenCV 圖像幾何變換教學:縮放、平移、旋轉、仿射與透視變換 hero image

← INSIGHTS & PERSPECTIVES | 機器學習

OpenCV 圖像幾何變換教學:縮放、平移、旋轉、仿射與透視變換

整理 OpenCV 幾何變換的用途、矩陣設定、cv.resize、warpAffine 與 warpPerspective 範例。

OpenCV 圖像幾何變換可以用來改變影像的尺寸、位置、角度與視角。實作時通常先判斷需求是縮放、平移、旋轉、仿射變換或透視變換,再選擇 `cv.resize()`、`cv.warpAffine()` 或 `cv.warpPerspective()`。

OpenCV 幾何變換要解決什麼問題?

OpenCV 幾何變換的核心目標是把影像座標重新映射到新的座標系。縮放改變大小,平移改變位置,旋轉改變方向,仿射與透視變換則處理更複雜的平面形變。

幾何變換常出現在資料前處理、文件校正、物件定位與影像增強。OpenCV 官方文件把相關函數放在 Geometric Image Transformations 模組,常用 API 包含 `resize`、`warpAffine`、`getAffineTransform`、`getPerspectiveTransform` 與 `warpPerspective`(OpenCV,存取日期:2026-08-27)。

實務判斷表:

需求建議函數需要的矩陣
改變圖片大小`cv.resize()`不需要
移動圖片位置`cv.warpAffine()`2x3 平移矩陣
旋轉圖片`cv.getRotationMatrix2D()` + `cv.warpAffine()`2x3 旋轉矩陣
三點對三點形變`cv.getAffineTransform()` + `cv.warpAffine()`2x3 仿射矩陣
四點拉平成矩形`cv.getPerspectiveTransform()` + `cv.warpPerspective()`3x3 透視矩陣

如何用 OpenCV 縮放圖像?

OpenCV 縮放圖像最直接的做法是使用 `cv.resize()`。開發者可以指定目標寬高,也可以用 `fx`、`fy` 指定水平與垂直倍率。

```python

import cv2 as cv

img = cv.imread('messi5.jpg')

res = cv.resize(img, None, fx=2, fy=2, interpolation=cv.INTER_CUBIC)

height, width = img.shape[:2]

res2 = cv.resize(img, (2 width, 2 height), interpolation=cv.INTER_CUBIC)

```

放大影像常用 `INTER_CUBIC` 或 `INTER_LINEAR`,縮小影像常用 `INTER_AREA`。本文的原始筆記把縮放放在第一步是合理的,因為後續平移與旋轉都會受到圖片尺寸影響。

如何用 OpenCV 平移與旋轉圖像?

OpenCV 平移與旋轉都可以透過 `cv.warpAffine()` 完成。平移矩陣直接指定 x 與 y 位移,旋轉矩陣則由 `cv.getRotationMatrix2D()` 產生。

平移範例:

```python

import numpy as np

import cv2 as cv

img = cv.imread('messi5.jpg', 0)

rows, cols = img.shape

matrix = np.float32([[1, 0, 100], [0, 1, 50]])

dst = cv.warpAffine(img, matrix, (cols, rows))

```

旋轉範例:

```python

matrix = cv.getRotationMatrix2D(((cols - 1) / 2.0, (rows - 1) / 2.0), 90, 1)

dst = cv.warpAffine(img, matrix, (cols, rows))

```

平移後超出畫布的像素會被裁掉。旋轉後若要保留完整圖像,需要重新計算輸出畫布大小,而不是直接沿用原本的 `(cols, rows)`。

仿射變換和透視變換怎麼選?

仿射變換適合保持平行線關係的平面變形,透視變換適合處理拍攝角度造成的遠近變形。文件掃描、名片校正與斜拍矩形拉正通常要用透視變換。

仿射變換用三組對應點:

```python

pts1 = np.float32([[50, 50], [200, 50], [50, 200]])

pts2 = np.float32([[10, 100], [200, 50], [100, 250]])

matrix = cv.getAffineTransform(pts1, pts2)

dst = cv.warpAffine(img, matrix, (cols, rows))

```

透視變換用四組對應點:

```python

pts1 = np.float32([[56, 65], [368, 52], [28, 387], [389, 390]])

pts2 = np.float32([[0, 0], [300, 0], [0, 300], [300, 300]])

matrix = cv.getPerspectiveTransform(pts1, pts2)

dst = cv.warpPerspective(img, matrix, (300, 300))

```

實務資訊增益:若影像中的矩形目標不是正面拍攝,先用輪廓找到四個角點,再做透視變換,通常比直接旋轉更穩定。

常見問題

QOpenCV 幾何變換一定要懂矩陣嗎?

OpenCV 幾何變換不一定要先完整推導矩陣。初學者可以先記住平移用 2x3 矩陣、旋轉用 `getRotationMatrix2D`、透視校正用四個點產生 3x3 矩陣。

Qcv.warpAffine 和 cv.warpPerspective 差在哪?

`cv.warpAffine()` 使用 2x3 矩陣,適合平移、旋轉、縮放與仿射變形。`cv.warpPerspective()` 使用 3x3 矩陣,適合把斜拍平面拉回正面。

QOpenCV 旋轉後圖片被裁掉怎麼辦?

OpenCV 旋轉後圖片被裁掉,通常是輸出畫布仍使用原圖尺寸。解法是根據旋轉角度重新計算新寬高,再調整旋轉矩陣中的平移量。

Q透視變換需要幾個點?

OpenCV 透視變換需要四組來源點與四組目標點。四個點通常對應矩形物件的左上、右上、左下、右下角。

Qinterpolation 參數要怎麼選?

縮小圖片常用 `cv.INTER_AREA`,放大圖片常用 `cv.INTER_LINEAR` 或 `cv.INTER_CUBIC`。若任務重視速度,`INTER_LINEAR` 通常是穩定選擇。

參考資料

最後更新

2026-08-27

延伸閱讀

關於作者 {#author}

Claire Chang | 企業 AI 導入與流程轉型顧問。專注於 AI Agent 架構設計、ERP 系統整合與企業 AI 治理。

首次發布:2022-12-16