OpenCV3計算機視覺Python語言實現筆記(五)


  圖像的幾何變換主要包括:平移、擴大與縮小、旋轉、仿射、透視等等。圖像變換是建立在矩陣運算基礎上的,通過矩陣運算可以很快的找到對應關系。

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()

 


免責聲明!

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



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