什麼是透視變換矩陣?
在影像處理中,**透視變換矩陣(Perspective Transformation Matrix)**是一種可以把一個平面上的四邊形區域,映射到另一個平面上四邊形區域的數學工具。
這個矩陣通常是 3x3 的形式,稱為「單映射矩陣(Homography Matrix)」。
公式
假設原圖上一個點座標是 (x, y),經過透視變換後的新座標 (x', y') 計算如下:|x'| |a11 a12 a13| |x|
|y'| = |a21 a22 a23| * |y|
|w | |a31 a32 a33| |1|
最後 x' = x'/w, y' = y'/w
這種變換可以同時做到平移、旋轉、縮放、斜切,甚至遠近感(透視效果)。
四個角點的意義與用法
在 OpenCV 中,如果你想要把一個矩形區域「拉正」或「變形」,你需要指定這個區域的四個角點。
這四個角點,通常是依照順時針或逆時針順序排列,分別代表:
- 左上角 (Top-Left)
- 右上角 (Top-Right)
- 右下角 (Bottom-Right)
- 左下角 (Bottom-Left)
範例說明
假設你有一個矩形區域,左上角座標是 (x0, y0),寬度是 W,高度是 H。
你可以這樣定義這個區域的四個角點:
self.template_4corner = [
(x0, y0), # 左上
(x0 + W, y0), # 右上
(x0 + W, y0 + H), # 右下
(x0, y0 + H) # 左下
]
每個點的意義
- (x0, y0):矩形的左上角
- (x0 + W, y0):從左上往右移動 W 個像素,得到右上角
- (x0 + W, y0 + H):從右上往下移動 H 個像素,得到右下角
- (x0, y0 + H):從左上往下移動 H 個像素,得到左下角
這樣的寫法可以快速產生一個矩形區域的四個角點座標。
圖示說明
(x0, y0) (x0+W, y0)
+---------------+
| |
| |
| |
+---------------+
(x0, y0+H) (x0+W, y0+H)
實際應用
1. 影像校正
如果你有一張照片,裡面有一張歪斜的紙張,你可以手動標記這張紙的四個角點,然後把它「拉正」成一個矩形。
視覺化說明
原圖(斜斜的紙):
\+-------------------+
| |
| /---------\ |
| / \ |
| / \ |
| \ / |
| \ / |
| \---------/ |
+-------------------+
經過 warpPerspective
後:
+-------------+
| |
| |
| |
| |
+-------------+
2. ROI(感興趣區域)擷取
在自動化檢測、OCR、文件掃描等應用中,常常需要先定義一個矩形區域(ROI),再進行後續處理。
3. 影像對齊
在做模板匹配、影像拼接時,也常常需要用四個角點來對齊不同的區域。
取得透視變換矩陣
你只要有來源區域的四個角點(如上),以及目標區域的四個角點(通常是 [(0,0), (W,0), (W,H), (0,H)]),就可以用 OpenCV 的 cv2.getPerspectiveTransform
來計算出變換矩陣 M:
import numpy as np
import cv2
src_pts = np.float32(self.template_4corner)
dst_pts = np.float32([(0, 0), (W, 0), (W, H), (0, H)])
M = cv2.getPerspectiveTransform(src_pts, dst_pts)
這個 M 就是你要的透視變換矩陣,可以用來做 cv2.warpPerspective
影像變形。
小結
- 四個角點的順序與座標,決定了你要變形的區域。
- 只要會組出這四個點,就能輕鬆做出 ROI 擷取、影像拉正、視角校正等功能。
- 這種寫法在自動化影像處理、工業檢測、文件掃描等領域非常常見。
實際程式範例文章 可參考我另外一篇文章喔
[OpenCV基礎][Python]warpPerspective透視變換