目錄
一、透視變換的定義與作用
二、透視變換的過程
三、OpenCV 中的透視變換函數
1.?cv2.getPerspectiveTransform(src, dst)
2.?cv2.warpPerspective(src, H, dsize, dst=None, flags=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT, borderValue=0)
四、文檔掃描校正(將傾斜文檔轉為正視圖)
五、透視變換 vs 仿射變換
六、注意事項
1、點坐標的準確性
2、邊界黑邊處理
3、非平面場景的限制
七、總結
一、透視變換的定義與作用
透視變換是將圖像從一個視平面投影到另一個視平面的幾何變換,用于解決圖像的透視畸變問題(如近大遠小的視覺效果),或實現視角轉換(如從傾斜圖像恢復正視圖)。
- 核心目標:通過 4 組對應點(原圖像與目標圖像中的坐標對),計算單應性矩陣(Homography Matrix),將任意四邊形區域映射為矩形(或其他四邊形),實現視角校正或投影變換。
- 應用場景:文檔掃描校正、無人機航拍圖像視角調整、增強現實(AR)中的虛擬物體疊加、目標檢測中的視角歸一化等。
二、透視變換的過程
????????對一張我們即將做透視變換圖像,首先要獲取到圖像中的4個坐標點,用于與目標圖像中的坐標對應,這四個點還是有順序的以坐標軸原點為參照點,距離原點最近的點為0號坐標,最遠的為2號坐標,這兩個點是最容易區分出來的;1號和3號位置可以通過坐標相減作為區分,距離X軸近的坐標的y值小于x值,所以按照x坐標減去y坐標得到的值1號坐標的值大于3號坐標的值。
? ? ? ? 區分0和2號坐標點:對四個點每個點坐標的x和y的值相加求和,我們發現,針對任意圖片輪廓,如果被四個點描繪,距離原點最近的點求和的值最小,在右下點的值求和的數值最大,可以區分出左上和右下兩個點
?????????區分1和3號坐標點:對四個點每個點坐標的x和y的值相減(x-y),針對任意圖片輪廓,如果被四個點描繪,位于右上角做差的值為一個很大的正數,在左下點的值做差的數值為負數,可以區分出左下和右上兩個點
三、OpenCV 中的透視變換函數
OpenCV 提供兩個核心函數實現透視變換:cv2.getPerspectiveTransform
?和?cv2.warpPerspective
。
1.?cv2.getPerspectiveTransform(src, dst)
-
功能:根據 4 組對應點對計算單應性矩陣?H。
-
參數:
-
src
:原圖像中 4 個點的坐標(形狀為?(4,2)
?或?(4,1,2)
?的浮點型數組)。 -
dst
:目標圖像中對應 4 個點的坐標(形狀同上,通常取矩形的四個角點,如?(0,0), (w,0), (w,h), (0,h)
)。
-
-
返回值:單應性矩陣?H(形狀為?
(3,3)
?的浮點型矩陣)。
2.?cv2.warpPerspective(src, H, dsize, dst=None, flags=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT, borderValue=0)
-
功能:根據單應性矩陣?H?對圖像進行透視變換。
-
參數:
-
src
:輸入圖像(單通道或三通道)。 -
H
:單應性矩陣(由?getPerspectiveTransform
?計算得到)。 -
dsize
:輸出圖像的大小(元組?(width, height)
)。 -
flags
:插值方法(默認?cv2.INTER_LINEAR
,常用?cv2.INTER_NEAREST
?或?cv2.INTER_CUBIC
)。 -
borderMode
:邊界填充模式(默認?cv2.BORDER_CONSTANT
,可填充黑色或自定義顏色)。 -
borderValue
:邊界填充值(默認 0,即黑色)。
-
四、文檔掃描校正(將傾斜文檔轉為正視圖)
假設原圖像中文檔的四個角點坐標為?src_points
,目標圖像中希望將其映射為寬度?w
、高度?h
?的矩形(四個角點為?dst_points
):
import cv2
import numpy as np# 讀取圖像
img = cv2.imread('document.jpg')
h, w = img.shape[:2]# 定義原圖像中的4個角點(需手動選擇或通過特征匹配獲取)
src_points = np.float32([[92, 112], [381, 90], [390, 264], [120, 309]]) # 左上、右上、右下、左下(順序需對應)
# 定義目標圖像中的4個角點(通常為矩形的四個角,左上、右上、右下、左下)
dst_points = np.float32([[0, 0], [w, 0], [w, h], [0, h]])# 計算單應性矩陣
H = cv2.getPerspectiveTransform(src_points, dst_points)# 應用透視變換
warped_img = cv2.warpPerspective(img, H, (w, h))# 顯示結果
cv2.imshow('Original Image', img)
cv2.imshow('Warped Image', warped_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
?可以看出我們將一張歪歪扭扭的照片扶正了,那么接下來我們就可以對圖片做一些圖像處理,使文本信息更加清晰。
關鍵點說明:
-
點的順序:
-
src_points
?和?dst_points
?中的點必須一一對應,通常按?左上→右上→右下→左下?的順序排列,確保映射區域正確。
-
-
手動選點:
-
可通過鼠標交互函數(如?
cv2.setMouseCallback
)手動選擇圖像中的四個角點,提高靈活性。
-
-
目標圖像大小:
-
dsize
?決定輸出圖像的寬度和高度,需根據實際需求設置(如原圖像尺寸或自定義尺寸)。
-
五、透視變換 vs 仿射變換
特性 | 透視變換 | 仿射變換 |
---|---|---|
變換類型 | 3D 投影到 2D 平面(非線性變換) | 2D 平面內的線性變換 + 平移 |
對應點要求 | 至少 4 個不共線點對 | 至少 3 個不共線點對 |
保持性質 | 直線映射為直線,但平行線可能不平行 | 直線、平行線、相對距離比例保持不變 |
變換矩陣 | 3×3 矩陣(8 個自由度) | 2×3 矩陣(6 個自由度) |
應用場景 | 視角校正、文檔掃描、AR 視角變換 | 旋轉、縮放、平移、剪切等簡單變換 |
仿射變換的知識我們將在后面通過案例來詳細介紹。?
六、注意事項
1、點坐標的準確性
輸入點對的微小誤差會顯著影響變換結果,建議通過特征匹配(如 SIFT、ORB)+ 隨機抽樣一致性算法(RANSAC)自動獲取魯棒的點對。
2、邊界黑邊處理
變換后的圖像可能出現黑邊(超出原圖像范圍),可通過調整?dsize
?或裁剪去除黑邊。
3、非平面場景的限制
透視變換假設場景為平面(如文檔、墻面),若處理 3D 物體(如立方體),需分面處理或使用 3D 重建技術。
七、總結
透視變換是圖像處理中解決視角畸變的核心技術,通過單應性矩陣實現任意四邊形到矩形(或其他四邊形)的映射,廣泛應用于文檔校正、圖像拼接、AR 等領域。關鍵在于準確獲取 4 組對應點對,并合理設置輸出圖像尺寸和插值方法。實際應用中,結合特征檢測與匹配算法(如 SIFT+RANSAC)可實現自動化的透視變換,提高魯棒性和效率。