OpenCV 提供了兩個變換函數,cv2.warpAffine 和 cv2.warpPerspective,使用這兩個函數你可以實現所有類型的變換。cv2.warpAffine 接收的參數是2 × 3 的變換矩陣,而 cv2.warpPerspective 接收的參數是 3 × 3 的變換矩陣。
- 擴展縮放
方法:resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None)
dsize為縮放大小
fx,fy為影響因子
interpolation為插值算法(在縮放時推薦使用 cv2.INTER_AREA,在擴展時推薦使用 cv2.INTER_CUBIC(慢) 和 cv2.INTER_LINEAR。默認情況下所有改變圖像尺寸大小的操作使用的插值方法都是 cv2.INTER_LINEAR)
1 import numpy as np 2 import cv2 3
4 img1 = cv2.imread("../image/min.jpg") 5
6 # 方式一
7 img2 = cv2.resize(img1, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC) 8
9 # 方式二
10 height, width = img1.shape[:2] 11 img3 = cv2.resize(img1, (2*width, 2*height), interpolation=cv2.INTER_LINEAR) 12
13
14 cv2.imshow("img", img1) 15 cv2.imshow("img2", img2) 16 cv2.imshow("img3", img3) 17 cv2.waitKey(0) 18 cv2.destroyAllWindows()
- 平移
若沿(x,y)方向平移(tx,ty),可以使用以下平移矩陣:
1 import cv2 2 import numpy as np 3
4 img = cv2.imread('../image/min.jpg',0) 5 rows,cols = img.shape 6
7 M = np.float32([[1,0,100],[0,1,50]]) 8 dst = cv2.warpAffine(img,M,(cols,rows)) 9
10 cv2.imshow('img',dst) 11 cv2.waitKey(0) 12 cv2.destroyAllWindows()
- 仿射變換
import numpy as np import cv2 def resize_img(img): # 擴大兩倍 # 方法一 # res = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC) # 方法二 # height, width = img.shape[:2] # res = cv2.resize(img, (2 * width, 2 * height), interpolation=cv2.INTER_CUBIC) # 圖像縮小 # 方法二 height, width = img.shape[:2] res = cv2.resize(img, (width // 2, height // 2), interpolation=cv2.INTER_AREA) res1 = cv2.resize(res, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC) cv2.imshow("normal", img) cv2.imshow("image", res1) # 平移 def offset_img(img): print(img.shape) rows, cols = img.shape[:2] M = np.float32([[1, 0, 100], [0, 1, 50]]) print(M) dst = cv2.warpAffine(img, M, (cols, rows)) cv2.imshow("normal", img) cv2.imshow("image", dst) # 旋轉 def rotation_img(img): rows, cols = img.shape[:2] # 生成旋轉矩陣(未縮放,以中心為原點) M = cv2.getRotationMatrix2D(((cols - 1) / 2.0, (rows - 1) / 2.0), 90, 1) print(M) dst = cv2.warpAffine(img, M, (cols, rows)) cv2.imshow("normal", img) cv2.imshow("image", dst) # 仿射變換 def affine_img(img): rows, cols = img.shape[:2] # 原圖像中的三個點位 pts1 = np.float32([[50, 50], [200, 50], [50, 200]]) # 變換后圖像對應的三個點位 pts2 = np.float32([[10, 100], [200, 50], [100, 250]]) # 生成變換矩陣 M = cv2.getAffineTransform(pts1, pts2) print(M) # 對圖像進行仿射變換 dst = cv2.warpAffine(img, M, (cols, rows)) cv2.imshow("normal", img) cv2.imshow("image", dst) if __name__ == "__main__": img = cv2.imread("../image/meixi.jpg") # print(img) # resize_img(img) # offset_img(img) # rotation_img(img) affine_img(img) cv2.namedWindow("normal") cv2.namedWindow("image") # cv2.imshow("image", img) cv2.waitKey(0) cv2.destroyAllWindows()