圖像的幾何變換主要包括:平移、擴大與縮小、旋轉、仿射、透視等等。圖像變換是建立在矩陣運算基礎上的,通過矩陣運算可以很快的找到對應關系。
1. 圖像的平移
圖像的平移,沿着x方向tx距離,y方向ty距離,需要構造移動矩陣M。通過numpy來產生這個矩陣,並將其賦值給仿射函數cv2.warpAffine().
仿射函數cv2.warpAffine()接受三個參數,需要變換的原始圖像,移動矩陣M 以及變換的圖像大小(這個大小如果不和原始圖像大小相同,那么函數會自動通過插值來調整像素間的關系)。
import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('flower.jpg') H = np.float32([[1,0,100],[0,1,50]]) rows,cols = img.shape[:2] res = cv2.warpAffine(img,H,(rows,cols)) #需要圖像、變換矩陣、變換后的大小 plt.subplot(121) plt.imshow(img) plt.subplot(122) plt.imshow(res) plt.show()

2. 圖像的縮放
圖像的縮放有專門的一個函數,cv2.resize(),需要確定的是縮放比例。另外一個就是在縮放以后圖像必然就會變化,這就又涉及到一個插值問題。那么這個函數中,縮放有幾種不同的插值(interpolation)方法,在縮小時推薦cv2.INTER_ARER,擴大是推薦cv2.INTER_CUBIC和cv2.INTER_LINEAR。默認都是cv2.INTER_LINEAR
import cv2 import matplotlib.pyplot as plt img = cv2.imread('flower.jpg') # 插值:interpolation # None本應該是放圖像大小的位置的,后面設置了縮放比例,所有就不要了 res1 = cv2.resize(img,None,fx=2,fy=2,interpolation=cv2.INTER_CUBIC) #直接規定縮放大小,這個時候就不需要縮放因子 height,width = img.shape[:2] res2 = cv2.resize(img,(2*width,2*height),interpolation=cv2.INTER_CUBIC) plt.subplot(131) plt.imshow(img) plt.subplot(132) plt.imshow(res1) plt.subplot(133) plt.imshow(res2) plt.show()

3. 圖像的旋轉
圖像旋轉需構造旋轉矩陣。opencv提供了一個函數: cv2.getRotationMatrix2D(),這個函數需要三個參數,旋轉中心,旋轉角度,旋轉后圖像的縮放比例。
import cv2 import matplotlib.pyplot as plt img = cv2.imread('flower.jpg') rows,cols = img.shape[:2] #第一個參數旋轉中心,第二個參數旋轉角度,第三個參數:縮放比例 M = cv2.getRotationMatrix2D((cols/2,rows/2),45,1) #第三個參數:變換后的圖像大小 res = cv2.warpAffine(img,M,(rows,cols)) plt.subplot(121) plt.imshow(img) plt.subplot(122) plt.imshow(res) plt.show()

4. 圖像的仿射
圖像的旋轉加上拉升就是圖像仿射變換,仿射變化也需要一個變換矩陣M,opencv提供了根據變換前后三個點的對應關系來自動求解M。這個函數是
M=cv2.getAffineTransform(pos1,pos2),其中兩個位置就是變換前后的對應位置關系,輸出的就是仿射矩陣M,然后再使用函數cv2.warpAffine()。
import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('flower.jpg') 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) #第三個參數:變換后的圖像大小 res = cv2.warpAffine(img,M,(rows,cols)) plt.subplot(121) plt.imshow(img) plt.subplot(122) plt.imshow(res) plt.show()

5. 圖像的透射
透視需要的是一個3*3的矩陣,opencv的函數是M = cv2.getPerspectiveTransform(pts1,pts2),其中pts需要變換前后的4個點對應位置。得到M后再通過函數cv2.warpPerspective(img,M,(200,200))進行。
import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('flower.jpg') rows,cols = img.shape[:2] pts1 = np.float32([[56,65],[238,52],[28,237],[239,240]]) pts2 = np.float32([[0,0],[200,0],[0,200],[200,200]]) M = cv2.getPerspectiveTransform(pts1,pts2) res = cv2.warpPerspective(img,M,(200,200)) plt.subplot(121) plt.imshow(img) plt.subplot(122) plt.imshow(res) plt.show()

