OpenCV_04 几何变换:图像缩放+图像平移+图像旋转+仿射变换+透射变换+图像金字塔
1 圖像縮放
縮放是對圖像的大小進行調整,即使圖像放大或縮小。
API
cv2.resize(src,dsize,fx=0,fy=0,interpolation=cv2.INTER_LINEAR)參數:
-
src : 輸入圖像
-
dsize: 絕對尺寸,直接指定調整后圖像的大小
-
fx,fy: 相對尺寸,將dsize設置為None,然后將fx和fy設置為比例因子即可
-
interpolation:插值方法
結果:
2 圖像平移
圖像平移將圖像按照指定方向和距離,移動到相應的位置。
參數:
-
img: 輸入圖像
-
M: 2*?3移動矩陣
對于(x,y)處的像素點,要把它移動到(x + t_x , y + t_y)處時,M矩陣應如下設置:
注意:將MM設置為np.float32類型的Numpy數組。
-
dsize: 輸出圖像的大小
注意:輸出圖像的大小,它應該是(寬度,高度)的形式。請記住,width=列數,height=行數。
-
示例
3 圖像旋轉
圖像旋轉是指圖像按照某個位置轉動一定角度的過程,旋轉中圖像仍保持這原始尺寸。圖像旋轉后圖像的水平對稱軸、垂直對稱軸及中心坐標原點都可能會發生變換,因此需要對圖像旋轉中的坐標進行相應轉換。
那圖像是怎么進行旋轉的呢?如下圖所示:
假設圖像逆時針旋轉\thetaθ,則根據坐標轉換可得旋轉轉換為:
其中:
?帶入上面的公式中,有:
也可以寫成:
同時我們要修正原點的位置,因為原圖像中的坐標原點在圖像的左上角,經過旋轉后圖像的大小會有所變化,原點也需要修正。
假設在旋轉的時候是以旋轉中心為坐標原點的,旋轉結束后還需要將坐標原點移到圖像左上角,也就是還要進行一次變換。
在OpenCV中圖像旋轉首先根據旋轉角度和旋轉中心獲取旋轉矩陣,然后根據旋轉矩陣進行變換,即可實現任意角度和任意中心的旋轉效果。
API
cv2.getRotationMatrix2D(center, angle, scale)參數:
- center:旋轉中心
- angle:旋轉角度
- scale:縮放比例
返回:
-
M:旋轉矩陣
調用cv.warpAffine完成圖像的旋轉
反饋:
4 仿射變換
圖像的仿射變換涉及到圖像的形狀位置角度的變化,是深度學習預處理中常到的功能,仿射變換主要是對圖像的縮放,旋轉,翻轉和平移等操作的組合。
那什么是圖像的仿射變換,如下圖所示,圖1中的點1, 2 和 3 與圖二中三個點一一映射, 仍然形成三角形, 但形狀已經大大改變,通過這樣兩組三點(感興趣點)求出仿射變換, 接下來我們就能把仿射變換應用到圖像中所有的點中,就完成了圖像的仿射變換。
在OpenCV中,仿射變換的矩陣是一個2×3的矩陣,
其中左邊的2×2子矩陣$A$是線性變換矩陣,右邊的2×1子矩陣B是平移項:
?
對于圖像上的任一位置(x,y),仿射變換執行的是如下的操作:
?
需要注意的是,對于圖像而言,寬度方向是x,高度方向是y,坐標的順序和圖像像素對應下標一致。所以原點的位置不是左下角而是右上角,y的方向也不是向上,而是向下。
在仿射變換中,原圖中所有的平行線在結果圖像中同樣平行。為了創建這個矩陣我們需要從原圖像中找到三個點以及他們在輸出圖像中的位置。然后cv2.getA?neTransform 會創建一個 2x3 的矩陣,最后這個矩陣會被傳給函數 cv2.warpA?ne。
示例
import numpy as np import cv2 as cv import matplotlib.pyplot as plt # 1 圖像讀取 img = cv.imread("./image/image2.jpg")# 2 仿射變換 rows,cols = img.shape[:2] # 2.1 創建變換矩陣 pts1 = np.float32([[50,50],[200,50],[50,200]]) pts2 = np.float32([[100,100],[200,50],[100,250]]) M = cv.getAffineTransform(pts1,pts2) # 2.2 完成仿射變換 dst = cv.warpAffine(img,M,(cols,rows))# 3 圖像顯示 fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(10,8),dpi=100) axes[0].imshow(img[:,:,::-1]) axes[0].set_title("原圖") axes[1].imshow(dst[:,:,::-1]) axes[1].set_title("仿射后結果") plt.show()
?
5 透射變換
透射變換是視角變化的結果,是指利用透視中心、像點、目標點三點共線的條件,按透視旋轉定律使承影面(透視面)繞跡線(透視軸)旋轉某一角度,破壞原有的投影光線束,仍能保持承影面上投影幾何圖形不變的變換。
?在opencv中,我們要找到四個點,其中任意三個不共線,然后獲取變換矩陣T,再進行透射變換。通過函數cv.getPerspectiveTransform找到變換矩陣,將cv.warpPerspective應用于此3x3變換矩陣。
import numpy as np import cv2 as cv import matplotlib.pyplot as plt # 1 讀取圖像 img = cv.imread("./image/image2.jpg") # 2 透射變換 rows,cols = img.shape[:2] # 2.1 創建變換矩陣 pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]]) pts2 = np.float32([[100,145],[300,100],[80,290],[310,300]])T = cv.getPerspectiveTransform(pts1,pts2) # 2.2 進行變換 dst = cv.warpPerspective(img,T,(cols,rows))# 3 圖像顯示 fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(10,8),dpi=100) axes[0].imshow(img[:,:,::-1]) axes[0].set_title("原圖") axes[1].imshow(dst[:,:,::-1]) axes[1].set_title("透射后結果") plt.show()6 圖像金字塔
圖像金字塔是圖像多尺度表達的一種,最主要用于圖像的分割,是一種以多分辨率來解釋圖像的有效但概念簡單的結構。
圖像金字塔用于機器視覺和圖像壓縮,一幅圖像的金字塔是一系列以金字塔形狀排列的分辨率逐步降低,且來源于同一張原始圖的圖像集合。其通過梯次向下采樣獲得,直到達到某個終止條件才停止采樣。
金字塔的底部是待處理圖像的高分辨率表示,而頂部是低分辨率的近似,層級越高,圖像越小,分辨率越低。
API
cv.pyrUp(img) #對圖像進行上采樣 cv.pyrDown(img) #對圖像進行下采樣2.實例
import numpy as np import cv2 as cv import matplotlib.pyplot as plt # 1 圖像讀取 img = cv.imread("./image/image2.jpg") # 2 進行圖像采樣 up_img = cv.pyrUp(img) # 上采樣操作 img_1 = cv.pyrDown(img) # 下采樣操作 # 3 圖像顯示 cv.imshow('enlarge', up_img) cv.imshow('original', img) cv.imshow('shrink', img_1) cv.waitKey(0) cv.destroyAllWindows()總結
圖像縮放:對圖像進行放大或縮小
cv.resize()
圖像平移:
指定平移矩陣后,調用cv.warpAffine()平移圖像
圖像旋轉:
調用cv.getRotationMatrix2D獲取旋轉矩陣,然后調用cv.warpAffine()進行旋轉
仿射變換:
調用cv.getAffineTransform將創建變換矩陣,最后該矩陣將傳遞給cv.warpAffine()進行變換
透射變換:
通過函數cv.getPerspectiveTransform()找到變換矩陣,將cv.warpPerspective()進行投射變換
金字塔
圖像金字塔是圖像多尺度表達的一種,使用的API:
cv.pyrUp(): 向上采樣
cv.pyrDown(): 向下采樣
總結
以上是生活随笔為你收集整理的OpenCV_04 几何变换:图像缩放+图像平移+图像旋转+仿射变换+透射变换+图像金字塔的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 智慧交通day00-项目简介
- 下一篇: 手机长曝光怎么设置_摄影教程丨手机如何拍