透視變換是一種將圖像中的某些部分拉伸或扭曲,使其呈現為不同視角的技術。在影像處理中,透視變換常用於文件掃描、物體校正、場景校正等應用。
本章將介紹透視變換的原理、操作步驟,並以文件掃描為例,說明如何將拍攝的文件影像校正為正面矩形,並比較其與一般仿射變換的差異。
透視變換(Perspective Transformation)是根據影像中的四個角點,計算一個 3x3 的變換矩陣,將這些點映射到新圖像中的指定位置。
這種變換能夠處理平面物體的傾斜、畸變,讓影像呈現如同正面拍攝的效果。
比較說明:
請準備一張包含平面文件或物體的圖片,例如 information_board.jpg
。
import cv2
import numpy as np
# 讀取影像
img = cv2.imread('information_board.jpg')
# 顯示原始影像
cv2.imshow('Original Image', img)
# 將以下程式碼放在所有顯示語句的最後面
cv2.waitKey()
cv2.destroyAllWindows()
說明:
選擇一張包含文件或物體的圖片,方便後續進行透視變換處理。
需選擇影像中的四個角點,通常是文件或物體的四個頂點。
可用滑鼠點選方式快速取得座標:
points = []
def select_point(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDOWN and len(points) < 4:
points.append([x, y])
cv2.circle(img, (x, y), 5, (0, 0, 255), -1)
cv2.imshow('Original Image', img)
cv2.imshow('Original Image', img)
cv2.setMouseCallback('Original Image', select_point)
cv2.waitKey(0)
cv2.destroyAllWindows()
print("你選的四個角點:", points)
如圖,紅色圓點標記了四個角落,按任意鍵後即可取得座標。
將選定的四個角點映射到一個矩形區域,通常根據文件大小設定目標座標。
使用 cv2.getPerspectiveTransform()
計算 3x3 透視變換矩陣。
用 cv2.warpPerspective()
套用變換矩陣,得到校正後的影像。
# 定義原始影像的四個角點(填入前面取得的座標)
pts1 = np.float32([[68, 42], [351, 8], [59, 258], [362, 290]])
# 定義目標矩形的四個點(左上、右上、左下、右下)
pts2 = np.float32([[0, 0], [400, 0], [0, 300], [400, 300]])
# 計算透視變換矩陣
matrix = cv2.getPerspectiveTransform(pts1, pts2)
# 應用透視變換
result = cv2.warpPerspective(img, matrix, (400, 300))
# 顯示結果
cv2.imshow('Warped Image', result)
說明:
cv2.getPerspectiveTransform()
:計算從原始圖像到目標圖像的透視變換矩陣。cv2.warpPerspective()
:應用變換矩陣,將影像中的四個點映射到新區域。方法比較:
方法 | 需選點數 | 可校正畸變 | 適用場景 | 優點 | 缺點 |
---|---|---|---|---|---|
仿射變換 | 3 | 否 | 基本旋轉/縮放/平移 | 計算簡單、速度快 | 無法校正透視畸變 |
透視變換 | 4 | 是 | 文件掃描、場景校正 | 可校正傾斜與畸變 | 需精確選取四個角點 |
透視變換技術廣泛應用於文件掃描、物體校正等場景。
只需選擇四個角點並計算變換矩陣,即可將影像校正為理想的視角。
與仿射變換相比,透視變換能處理更複雜的畸變,適合多種實務應用