opencv python 图像缩放/图像平移/图像旋转/仿射变换/透视变换
Geometric Transformations of Images
1圖像轉(zhuǎn)換
OpenCV提供了兩個轉(zhuǎn)換函數(shù)cv2.warpAffine和cv2.warpPerspective,可以使用它們進行各種轉(zhuǎn)換。 cv2.warpAffine采用2x3變換矩陣,而cv2.warpPerspective采用3x3變換矩陣作為輸入。
2圖像縮放
縮放只是調(diào)整圖像大小.為此,OpenCV附帶了一個函數(shù)cv.resize().
cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
- 對shrinking,優(yōu)選的interpolation方法:cv2.INTER_AREA該方法可以避免波紋的出現(xiàn)
- 對zooming,優(yōu)選的interpolation方法:cv2.INTER_CUBIC和cv2.INTER_LINEAR(默認(rèn))
方法一
import numpy as np import cv2img = cv2.imread('messi5.jpg')res = cv2.resize(img,None,fx=2, fy=2, interpolation = cv2.INTER_CUBIC)方法二
import numpy as np import cv2height, width = img.shape[:2] res = cv2.resize(img,(2*width, 2*height), interpolation = cv2.INTER_CUBIC)3圖像平移
平移是對象位置的轉(zhuǎn)換。 如果你知道(x,y)方向的偏移,讓它為(tx,ty),你可以創(chuàng)建變換矩陣M,如下所示:
$$ M= \left[ \begin{matrix} 1 & 0 & tx \\ 0 & 1 & ty \end{matrix} \right] \ $$
可以將其設(shè)置為np.float32類型的Numpy數(shù)組,并將其傳遞給cv.warpAffine()函數(shù).
應(yīng)用
按(100,50)平移
代碼:
4圖像旋轉(zhuǎn)
通過變換矩陣實現(xiàn)圖像旋轉(zhuǎn)角度θ:
$$ M= \left[ \begin{matrix} cosθ & -sinθ \\ sinθ & cosθ \end{matrix} \right] \ $$
OpenCV提供可調(diào)旋轉(zhuǎn),旋轉(zhuǎn)中心可調(diào),因此可以在任何的位置旋轉(zhuǎn).修正的變換矩陣由下式給出:
$$ \left[ \begin{matrix} \alpha & \beta & (1-\alpha) \cdot center.x - \beta\cdot center.y \\ -\beta & \alpha & \beta\cdot center.x + (1-\alpha) \cdot center.y \end{matrix} \right] \ $$
$ \alpha = scale \cdot cosθ $
$ \beta = scale \cdot sinθ $
為了找到這個轉(zhuǎn)換矩陣,OpenCV提供了一個函數(shù)cv2.getRotationMatrix2D.
應(yīng)用
將圖像相對于中心旋轉(zhuǎn)90度而不進行任何縮放
代碼:
5仿射變換
在仿射變換中,原始圖像中的所有平行線仍將在輸出圖像中平行。 為了找到變換矩陣,我們需要輸入圖像中的三個點及其在輸出圖像中的相應(yīng)位置。 然后cv.getAffineTransform將創(chuàng)建一個2x3矩陣,該矩陣將傳遞給cv.warpAffine。
代碼:
5透視變換
對于透視變換,需要一個3x3變換矩陣。 即使在轉(zhuǎn)換之后,直線仍將保持筆直. 要找到此變換矩陣,輸入圖像上需要4個點,輸出圖像上需要相應(yīng)的點. 在這4個點中,其中3個不應(yīng)該共線. 然后可以通過函數(shù)cv2.getPerspectiveTransform找到變換矩陣. 然后將cv2.warpPerspective應(yīng)用于此3x3變換矩陣。
代碼:
import cv2 import numpy as np import matplotlib.pylab as pltimg = cv2.imread('img6.jpg') rows,cols,ch = img.shapepts1 = np.float32([[56,65],[368,52],[28,387],[389,390]]) pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]])M = cv2.getPerspectiveTransform(pts1,pts2)dst = cv2.warpPerspective(img,M,(300,300))plt.subplot(121),plt.imshow(img),plt.title('Input') plt.subplot(122),plt.imshow(dst),plt.title('Output') plt.show()
NOTE:
仿射變換和透視變換更直觀的叫法可以叫做“平面變換”和“空間變換”或者“二維坐標(biāo)變換”和“三維坐標(biāo)變換”.
從另一個角度也能說明三維變換和二維變換的意思,仿射變換的方程組有6個未知數(shù),所以要求解就需要找到3組映射點,三個點剛好確定一個平面.透視變換的方程組有8個未知數(shù),所以要求解就需要找到4組映射點,四個點就剛好確定了一個三維空間.
總結(jié)
以上是生活随笔為你收集整理的opencv python 图像缩放/图像平移/图像旋转/仿射变换/透视变换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端学习(3335):ant desig
- 下一篇: 《数字电子技术基础》4.3 若干常用的组