目標(biāo)
變換OpenCV提供了兩個(gè)轉(zhuǎn)換函數(shù)cv.warpAffine和cv.warpPerspective,您可以使用它們進(jìn)行各種轉(zhuǎn)換。cv.warpAffine采用2x3轉(zhuǎn)換矩陣,而cv.warpPerspective采用3x3轉(zhuǎn)換矩陣作為輸入。 縮放 縮放只是調(diào)整圖像的大小。為此,OpenCV帶有一個(gè)函數(shù)cv.resize()。圖像的大小可以手動(dòng)指定,也可以指定縮放比例。也可使用不同的插值方法。首選的插值方法是cv.INTER_AREA用于縮小,cv.INTER_CUBIC(慢)和cv.INTER_LINEAR用于縮放。默認(rèn)情況下,出于所有調(diào)整大小的目的,使用的插值方法為cv.INTER_LINEAR。您可以使用以下方法調(diào)整輸入圖像的大小: import numpy as npimport cv2 as cvimg = cv.imread('messi5.jpg')res = cv.resize(img,None,fx=2, fy=2, interpolation = cv.INTER_CUBIC)#或者h(yuǎn)eight, width = img.shape[:2]res = cv.resize(img,(2*width, 2*height), interpolation = cv.INTER_CUBIC) 平移 平移是物體位置的移動(dòng)。如果您知道在(x,y)方向上的位移,則將其設(shè)為(t_x,$ty$),你可以創(chuàng)建轉(zhuǎn)換矩陣M,如下所示: 您可以將其放入np.float32類(lèi)型的Numpy數(shù)組中,并將其傳遞給cv.warpAffine函數(shù)。參見(jiàn)下面偏移為(100, 50)的示例: import numpy as npimport cv2 as cvimg = cv.imread('messi5.jpg',0)rows,cols = img.shapeM = np.float32([[1,0,100],[0,1,50]])dst = cv.warpAffine(img,M,(cols,rows))cv.imshow('img',dst)cv.waitKey(0)cv.destroyAllWindows() 注意 cv.warpAffine函數(shù)的第三個(gè)參數(shù)是輸出圖像的大小,其形式應(yīng)為(width,height)。記住width =列數(shù),height =行數(shù)。 你將看到下面的結(jié)果: 旋轉(zhuǎn) 圖像旋轉(zhuǎn)角度為$θ$是通過(guò)以下形式的變換矩陣實(shí)現(xiàn)的: 但是OpenCV提供了可縮放的旋轉(zhuǎn)以及可調(diào)整的旋轉(zhuǎn)中心,因此您可以在自己喜歡的任何位置旋轉(zhuǎn)。修改后的變換矩陣為 其中: 為了找到此轉(zhuǎn)換矩陣,OpenCV提供了一個(gè)函數(shù)cv.getRotationMatrix2D。請(qǐng)檢查以下示例,該示例將圖像相對(duì)于中心旋轉(zhuǎn)90度而沒(méi)有任何縮放比例。 img = cv.imread('messi5.jpg',0)rows,cols = img.shape# cols-1 和 rows-1 是坐標(biāo)限制M = cv.getRotationMatrix2D(((cols-1)/2.0,(rows-1)/2.0),90,1)dst = cv.warpAffine(img,M,(cols,rows)) 查看結(jié)果: 仿射變換 在仿射變換中,原始圖像中的所有平行線(xiàn)在輸出圖像中仍將平行。為了找到變換矩陣,我們需要輸入圖像中的三個(gè)點(diǎn)及其在輸出圖像中的對(duì)應(yīng)位置。然后cv.getAffineTransform將創(chuàng)建一個(gè)2x3矩陣,該矩陣將傳遞給cv.warpAffine。 查看以下示例,并查看我選擇的點(diǎn)(以綠色標(biāo)記): img = cv.imread('drawing.png')rows,cols,ch = img.shapepts1 = np.float32([[50,50],[200,50],[50,200]])pts2 = np.float32([[10,100],[200,50],[100,250]])M = cv.getAffineTransform(pts1,pts2)dst = cv.warpAffine(img,M,(cols,rows))plt.subplot(121),plt.imshow(img),plt.title('Input')plt.subplot(122),plt.imshow(dst),plt.title('Output') 查看結(jié)果: 透視變換 對(duì)于透視變換,您需要3x3變換矩陣。即使在轉(zhuǎn)換后,直線(xiàn)也將保持直線(xiàn)。要找到此變換矩陣,您需要在輸入圖像上有4個(gè)點(diǎn),在輸出圖像上需要相應(yīng)的點(diǎn)。在這四個(gè)點(diǎn)中,其中三個(gè)不應(yīng)共線(xiàn)。然后可以通過(guò)函數(shù)cv.getPerspectiveTransform找到變換矩陣。然后將cv.warpPerspective應(yīng)用于此3x3轉(zhuǎn)換矩陣。 請(qǐng)參見(jiàn)下面的代碼: img = cv.imread('sudoku.png')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 = cv.getPerspectiveTransform(pts1,pts2)dst = cv.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() 結(jié)果:
|
|
來(lái)自: taotao_2016 > 《圖像處理》