warpAffine
和 warpPerspective
都是 OpenCV 中用於圖像變換的函數,主要差異在於這兩種函數所使用的變換矩陣的類型和適用場景。
本文主要討論warpAffine
,另外warpPerspective
可以此篇文章
[OpenCV基礎][Python]warpPerspective透視變換
仿射變換是一種線性的、直線的、平行性的幾何變換,將一個二維空間中的點映射到另一個二維空間中。這種變換可以包括平移、旋轉、縮放、剪切等操作。
仿射變換可以用warpAffine()
來實現。結果圖如下
warpAffine
:仿射變換
warpPerspective
:透視變換
cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])
src
:要進行透視變換的輸入圖像。M
:透視變換的2x3變換矩陣。dsize
:輸出圖像的大小,以元組(width, height)表示。dst
:輸出圖像,可選參數,如果未提供,則函數會創建一個與 dsize
相同大小的空白圖像。flags
:進行變換時的插值方法:cv2.INTER_NEAREST
:最近鄰插值,使用最近鄰的像素值進行插值,速度最快,但效果可能不夠平滑。cv2.INTER_LINEAR
:雙線性插值,使用相鄰四個像素的加權平均值,效果比最近鄰好一些,但計算成本較高。cv2.INTER_CUBIC
:雙三次插值,使用相鄰的16個像素進行插值,產生更平滑的效果,但計算成本最高。borderMode
:用於處理邊界的模式:cv2.BORDER_CONSTANT
:常數邊界模式,邊界外的像素使用指定的常數值填充。cv2.BORDER_REFLECT
:反射邊界模式,邊界外的像素是邊界內像素的鏡像反射。cv2.BORDER_WRAP
:循環邊界模式,像素位置溢出時,回到相對應的另一邊。borderMode
設定為 cv2.BORDER_CONSTANT
時:可以使用 borderValue
參數指定邊界的常數值。這個值通常是一個顏色值,例如白色 (255, 255, 255)
或黑色 (0, 0, 0)
。參數幾乎與warpPerspective
相似,主要區別在於變換矩陣 M
的大小和形式,以及 warpPerspective
能夠處理更一般的透視變換,而 warpAffine
僅能處理保持平行線的仿射變換。
import cv2
import numpy as np
# 讀取輸入圖像
img = cv2.imread('input_image.jpg')
# 指定物體的位移量(平移50個像素到右下方)
tx, ty = 50, 50
# 定義仿射變換矩陣 M
M = np.float32([[1, 0, tx], [0, 1, ty]])
# 應用仿射變換
result = cv2.warpAffine(img, M, (img.shape[1], img.shape[0]))
# 顯示原始圖像和變換後的圖像
cv2.imshow('Original Image', img)
cv2.imshow('Affine Transformed Image', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
import numpy as np
# 讀取輸入圖像
img = cv2.imread('123.jpg')
# 仿射變換前的三個點,這些點可以是手動選取或使用檢測算法(例如角點檢測)
src_pts = np.array([[2700, 970], #左上
[6000, 60], #右上
[6000, 3300]], #右下
dtype=np.float32)
# 仿射變換後的目標三個點
dst_pts = np.array([[0, 0], #左上
[6000, 0], #右上
[6000, 3368]], #右下
dtype=np.float32)
# 計算仿射變換矩陣 M
M = cv2.getAffineTransform(src_pts, dst_pts)
# 應用仿射變換
result = cv2.warpAffine(img, M, (img.shape[1], img.shape[0]))
# 顯示原始圖像和變換後的圖像
cv2.imshow('Original Image', img)
cv2.imshow('warpAffine Transformed Image', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
一個二維仿射變換可以表示為以下的矩陣形式:
x,y
是原始圖像中的座標,x′,y′
是變換後的座標,矩陣中的a,b,c,d,e,f
是變換矩陣的參數。
a
和e
控制縮放(縮放因子),當它們不等於1時,進行縮放操作。b
和 d
控制剪切,當它們不等於0時,進行剪切操作。c
和 f
控制平移,它們是平移的量。簡單來說,對於一個點 (x,y)
,使用變換矩陣進行仿射變換的計算就是將這個點的坐標應用於變換矩陣的線性運算。