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