圖像仿射變換和透視變換
圖像的仿射變換就是圖像的旋轉(zhuǎn)加上拉升,說直白點,就是把矩形變成平行四邊形。要把矩形變成平行四邊行,只需要拉伸其四個角點就行了,事實上,只需要確定前面三個點,最后一個點自然就能確定了。也就是要改變下圖所示的三個點的值,對應(yīng)到新的平行四邊形上相應(yīng)的三個點即可。 這三個原點以及三個變換后的點呢,就組成了一個變換矩陣M。opencv提供了根據(jù)變換前后三個點的對應(yīng)關(guān)系來自動求解M。這個函數(shù)是M=cv2.getAffineTransform(pos1,pos2),其中兩個位置就是變換前后的對應(yīng)位置關(guān)系。輸出的就是仿射矩陣M。然后在使用函數(shù)cv2.warpAffine()即可完成仿射變換。如下圖所示,左圖是原圖,右圖是仿射變換之后的結(jié)果圖。 from matplotlib import pyplot as pltimg = cv2.imread('E:/image/le.jpg')rows,cols = img.shape[:2]pts1 = np.float32([[0,0],[rows-1,0],[0,cols-1]])#原來三個點的位置pts2 = np.float32([[20,20],[rows-50,50],[100,cols-100]])#變換后三個點的位置M = cv2.getAffineTransform(pts1,pts2)#合成變換矩陣res = cv2.warpAffine(img,M,(cols,rows))#第三個參數(shù):變換后的圖像大小plt.imshow(img[:,:,[2,1,0]])plt.imshow(res[:,:,[2,1,0]])對于透視變換,需要確定四個點的位置,其四個點對應(yīng)的位置如下圖。 可以通過opencv的函數(shù)cv2.getPerspectiveTransform找到變換矩陣. 然后將cv2.warpPerspective應(yīng)用于此3x3變換矩陣,即可完成透視變換。有一種說法是說,通過透視變換可以將平行四邊形變?yōu)榫匦巍?/span> import matplotlib.pylab as pltimg = cv2.imread('E:/image/ch.jpg')pts1 = np.float32([[20,20],[rows-50,50],[0,cols],[rows-50,cols-50]])#原圖四個角點的位置,我的第三個點位置沒找對,所以結(jié)果圖只有1,2,4三個點進(jìn)行了拉伸,而第3個點沒變。pts2 = np.float32([[0,0],[rows,0],[0,cols],[rows,cols]])#結(jié)果圖的四個點對應(yīng)的位置,我這里是四個頂點M = cv2.getPerspectiveTransform(pts1,pts2)#合成變換矩陣dst = cv2.warpPerspective(img,M,(cols,rows))#進(jìn)行變換plt.subplot(121),plt.imshow(img[:,:,[2,1,0]]),plt.title('Input'),plt.axis('off')plt.subplot(122),plt.imshow(dst[:,:,[2,1,0]]),plt.title('Output'),plt.axis('off')
|