python-opencv幾何變換--仿射變換、透視變換


仿射變換

opencv提供了函數cv2.getAffineTransform()來創建一個2*3的矩陣,該矩陣傳遞給cv2.warpAffine()。該函數語法格式為:

retval = cv.getAffineTransform(src, dst)
'''
src:輸入圖像的三個點坐標
dst:輸出圖像的三個點坐標
三個點分別對應左上角、右上角、左下角
'''

查看如下放射變換實例:

import numpy as np
import cv2 as cv

img = cv.imread(r'Lena.png', 1)
rows, cols, channels = img.shape
p1 = np.float32([[0,0], [cols-1,0], [0,rows-1]])
p2 = np.float32([[0,rows*0.3], [cols*0.8,rows*0.2], [cols*0.15,rows*0.7]])
M = cv.getAffineTransform(p1, p2)
dst = cv.warpAffine(img, M, (cols,rows))
cv.imshow('original', img)
cv.imshow('result', dst)
cv.waitKey(0)
cv.destroyAllWindows()

效果圖:

imageimage

 

透視變換

上述仿射變換可以將矩形映射成任意平行四邊形,各邊仍保持平行;而透視變換可以將矩形映射為任意四邊形,直線仍保持直線。

由於不再是平行四邊形,需提供四個頂點。

透視變換通過函數cv2.warpPerspective()實現,語法為:

dst = cv.warpPerspective(src, M, dsize[, flags[, borderMode[, borderValue]]])
'''
dst:透視后的輸出圖像,dsize決定輸出圖像大小
src:輸入圖像
M:3*3變換矩陣
flags:插值方法,默認為INTER_LINEAR
borderMode:邊類型,默認為BORDER_CONSTANT
borderValue:邊界值,默認為0
'''

透視變換通過函數cv2.getPerspectiveTransform()來生成轉換矩陣,需輸入輸入圖像和輸出圖像的四個頂點的坐標。

import numpy as np
import cv2 as cv

img = cv.imread(r'Lena.png', 1)
rows, cols, channels = img.shape
p1 = np.float32([[0,0], [cols-1,0], [0,rows-1], [rows-1,cols-1]])
p2 = np.float32([[0,rows*0.3], [cols*0.8,rows*0.2], [cols*0.15,rows*0.7], [cols*0.8,rows*0.8]])
M = cv.getPerspectiveTransform(p1,p2)
dst = cv.warpPerspective(img, M, (cols, rows))
cv.imshow('original', img)
cv.imshow('result', dst)
cv.waitKey(0)
cv.destroyAllWindows()

效果圖:

imageimage


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM