Geometric Transformations of Images html
OpenCV提供了兩個轉換函數cv2.warpAffine
和cv2.warpPerspective
,可使用它們進行各類轉換。 cv2.warpAffine
採用2x3變換矩陣,而cv2.warpPerspective
採用3x3變換矩陣做爲輸入。數組
縮放只是調整圖像大小.爲此,OpenCV附帶了一個函數cv.resize()
.cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
函數
cv2.INTER_AREA
該方法能夠避免波紋的出現 cv2.INTER_CUBIC
和cv2.INTER_LINEAR
(默認) 方法一spa
import numpy as np import cv2 img = cv2.imread('messi5.jpg') res = cv2.resize(img,None,fx=2, fy=2, interpolation = cv2.INTER_CUBIC)
方法二code
import numpy as np import cv2 height, width = img.shape[:2] res = cv2.resize(img,(2*width, 2*height), interpolation = cv2.INTER_CUBIC)
平移是對象位置的轉換。 若是你知道(x,y)方向的偏移,讓它爲(tx,ty),你能夠建立變換矩陣M,以下所示:orm
$$ M= \left[ \begin{matrix} 1 & 0 & tx \\ 0 & 1 & ty \end{matrix} \right] \ $$htm
能夠將其設置爲np.float32類型的Numpy數組,並將其傳遞給cv.warpAffine()函數.對象
按(100,50)平移
代碼:blog
import cv2 import numpy as np img = cv2.imread('img.jpg',0) rows,cols = img.shape M = np.float32([[1,0,100],[0,1,50]]) dst = cv2.warpAffine(img,M,(cols,rows)) cv2.imshow('img',img) cv2.imshow('dst',dst) cv2.waitKey(0) cv2.destroyAllWindows()
經過變換矩陣實現圖像旋轉角度θ:ip
$$ M= \left[ \begin{matrix} cosθ & -sinθ \\ sinθ & cosθ \end{matrix} \right] \ $$
OpenCV提供可調旋轉,旋轉中心可調,所以能夠在任何的位置旋轉.修正的變換矩陣由下式給出:
$$ \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θ $
爲了找到這個轉換矩陣,OpenCV提供了一個函數cv2.getRotationMatrix2D
.
將圖像相對於中心旋轉90度而不進行任何縮放
代碼:
import cv2 import numpy as np img = cv2.imread('img.jpg',0) rows,cols = img.shape # cols-1 and rows-1 are the coordinate limits. M = cv2.getRotationMatrix2D(((cols-1)/2.0,(rows-1)/2.0),90,1) dst = cv2.warpAffine(img,M,(cols,rows)) cv2.imshow('img',img) cv2.imshow('dst',dst) cv2.waitKey(0) cv2.destroyAllWindows()
在仿射變換中,原始圖像中的全部平行線仍將在輸出圖像中平行。 爲了找到變換矩陣,咱們須要輸入圖像中的三個點及其在輸出圖像中的相應位置。 而後cv.getAffineTransform將建立一個2x3矩陣,該矩陣將傳遞給cv.warpAffine。
代碼:
import cv2 import numpy as np import matplotlib.pylab as plt img = cv2.imread('img5.jpg') rows,cols,ch = img.shape pts1 = np.float32([[50,50],[200,50],[50,200]]) pts2 = np.float32([[10,100],[200,50],[100,250]]) M = cv2.getAffineTransform(pts1,pts2) dst = cv2.warpAffine(img,M,(cols,rows)) plt.subplot(121),plt.imshow(img),plt.title('Input') plt.subplot(122),plt.imshow(dst),plt.title('Output') plt.show()
對於透視變換,須要一個3x3變換矩陣。 即便在轉換以後,直線仍將保持筆直. 要找到此變換矩陣,輸入圖像上須要4個點,輸出圖像上須要相應的點. 在這4個點中,其中3個不該該共線. 而後能夠經過函數cv2.getPerspectiveTransform
找到變換矩陣. 而後將cv2.warpPerspective
應用於此3x3變換矩陣。
代碼:
import cv2 import numpy as np import matplotlib.pylab as plt img = cv2.imread('img6.jpg') rows,cols,ch = img.shape pts1 = 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:仿射變換和透視變換更直觀的叫法能夠叫作「平面變換」和「空間變換」或者「二維座標變換」和「三維座標變換」.從另外一個角度也能說明三維變換和二維變換的意思,仿射變換的方程組有6個未知數,因此要求解就須要找到3組映射點,三個點恰好肯定一個平面.透視變換的方程組有8個未知數,因此要求解就須要找到4組映射點,四個點就恰好肯定了一個三維空間.