正規(guī)品牌網(wǎng)站設(shè)計(jì)價(jià)格網(wǎng)絡(luò)優(yōu)化工程師有前途嗎
前言:Hello大家好,我是小哥談。OpenCV中的幾何變換是指改變圖像的幾何結(jié)構(gòu),例如大小、角度和形狀等,讓圖像呈現(xiàn)出縮放、翻轉(zhuǎn)、旋轉(zhuǎn)和透視效果。這些幾何變換操作都涉及復(fù)雜、精密的計(jì)算。OpenCV將這些計(jì)算過程都封裝成了非常靈活的方法,開發(fā)者只需要修改一些參數(shù),就可以看到圖像的變換效果。本節(jié)課就介紹幾種常見的幾何變換效果及其實(shí)現(xiàn)方法。🌈
前期回顧:
? ? ? ? ? ?史上最全OpenCV常用方法及使用說明匯總,建議收藏!
? ? ? ? ? ?OpenCV基礎(chǔ)知識(shí)(1)— OpenCV概述
? ? ? ? ? ?OpenCV基礎(chǔ)知識(shí)(2)— 圖像處理的基本操作
? ? ? ? ? ?OpenCV基礎(chǔ)知識(shí)(3)— 圖像數(shù)字化基礎(chǔ)(像素、色彩空間)
? ? ? ? ? ?OpenCV基礎(chǔ)知識(shí)(4)— 繪制圖形?? ? ?
? ? ? ? ? ?目錄
🚀1.縮放
💥💥1.1 dsize參數(shù)實(shí)現(xiàn)縮放
💥💥1.2?fx參數(shù)和fy參數(shù)實(shí)現(xiàn)縮放
🚀2.翻轉(zhuǎn)
🚀3.旋轉(zhuǎn)
🚀4.透視
🚀1.縮放
“縮”表示縮小,“放”表示放大,通過OpenCV中提供的resize()方法就可以隨意更改圖像的大小比例,其語法格式如下:
dst = cv2.resize(src,dsize,fx,fy,interpolation)
參數(shù)說明:
src:原始圖像
dsize:輸出圖像的大小,格式為(寬,高),單位為像素。
fx:可選參數(shù)。水平方向的縮放比例。
fy:可選參數(shù)。垂直方向的縮放比例。
interpolation:可選參數(shù)。縮放的插值方式,在圖像縮小或者放大時(shí)需要?jiǎng)h減或補(bǔ)充像素,該參數(shù)可以指定使用哪種算法對(duì)像素進(jìn)行增減。建議使用默認(rèn)值。
返回值說明:
dst:縮放之后的圖像
🍀resize()方法有兩種使用方式,一種是通過dsize參數(shù)實(shí)現(xiàn)縮放,另一種是通過 fx 和 fy 參數(shù)實(shí)現(xiàn)縮放,下面分別進(jìn)行介紹。
💥💥1.1 dsize參數(shù)實(shí)現(xiàn)縮放
dsize參數(shù)的格式是一個(gè)元組,例如(100,200),表示將圖像按照寬100像素、高200像素的大小進(jìn)行縮放。如果使用dsize參數(shù),則可以不寫 fx 和 fy 參數(shù)。
代碼如下:
import cv2
img = cv2.imread("1.jpg") # 讀取圖像
dst1 = cv2.resize(img, (300, 300)) # 按照寬300像素、高300像素的大小進(jìn)行縮放
cv2.imshow("img", img) # 顯示原圖
cv2.imshow("dst1", dst1) # 顯示縮放圖像
cv2.waitKey() # 按下任何鍵盤按鍵后
cv2.destroyAllWindows() # 釋放所有窗體
原始圖像:
縮放后圖像:
💥💥1.2?fx參數(shù)和fy參數(shù)實(shí)現(xiàn)縮放
使用 fx 參數(shù)和 fy 參數(shù)控制縮放的時(shí)候,dsize參數(shù)值必須使用None,否則 fx 和 fy 就會(huì)失效。
fx 參數(shù)和 fy 參數(shù)可以使用浮點(diǎn)值,小于1的值表示縮小,大于1的值表示放大。
代碼如下:
import cv2
img = cv2.imread("1.jpg") # 讀取圖像
dst3 = cv2.resize(img, None, fx=1 / 3, fy=1 / 2) # 將寬縮小到原來的1/3、高縮小到原來的1/2
cv2.imshow("img", img) # 顯示原圖
cv2.imshow("dst3", dst3) # 顯示縮放圖像
cv2.waitKey() # 按下任何鍵盤按鍵后
cv2.destroyAllWindows() # 釋放所有窗體
?原始圖像:
?縮放后圖像:
🚀2.翻轉(zhuǎn)
水平線被稱為X軸,垂直線被稱為Y軸。圖像沿著X軸或者Y軸翻轉(zhuǎn)之后,可以呈現(xiàn)出鏡面倒影的效果。OpenCV通過cv2.flip()方法實(shí)現(xiàn)翻轉(zhuǎn)效果,其語法如下:
dst = cv2.flip(src,flipCode)
參數(shù)說明:
src:原始圖像
flipCode:翻轉(zhuǎn)類型,類型值如下表所示。
參數(shù)值 | 含義 |
0 | 沿著X軸翻轉(zhuǎn) |
正數(shù) | 沿著Y軸翻轉(zhuǎn) |
負(fù)數(shù) | 同時(shí)沿著X軸、Y軸翻轉(zhuǎn) |
返回值說明:
dst:翻轉(zhuǎn)之后的圖像
代碼如下:
import cv2
img = cv2.imread("1.jpg") # 讀取圖像
dst1 = cv2.flip(img, 0) # 沿X軸翻轉(zhuǎn)
dst2 = cv2.flip(img, 1) # 沿Y軸翻轉(zhuǎn)
dst3 = cv2.flip(img, -1) # 同時(shí)沿X軸、Y軸翻轉(zhuǎn)
cv2.imshow("img", img) # 顯示原圖
cv2.imshow("dst1", dst1) # 顯示翻轉(zhuǎn)之后的圖像
cv2.imshow("dst2", dst2)
cv2.imshow("dst3", dst3)
cv2.waitKey() # 按下任何鍵盤按鍵后
cv2.destroyAllWindows() # 釋放所有窗體
效果如圖所示:
🚀3.旋轉(zhuǎn)
讓圖像旋轉(zhuǎn)也是通過M矩陣實(shí)現(xiàn)的,但得出這個(gè)矩陣需要做很復(fù)雜的運(yùn)算,于是OpenCV提供了getRotationMatrix2D()方法來自動(dòng)計(jì)算出旋轉(zhuǎn)圖像的M矩陣。其語法格式如下所示:
M = cv2.getRotationMatrix2D(center,angle,scale)
參數(shù)說明:
center:旋轉(zhuǎn)的中心點(diǎn)坐標(biāo)
angle:旋轉(zhuǎn)的角度(不是弧度)。正數(shù)表示逆時(shí)針旋轉(zhuǎn),負(fù)數(shù)表示順時(shí)針旋轉(zhuǎn)。
scale:縮放比例,浮點(diǎn)類型。如果取值為1,表示圖像保持原來的比例。
返回值說明:
M:方法計(jì)算出的仿射矩陣
🍀比如讓圖像逆時(shí)針旋轉(zhuǎn)30°的同時(shí)縮小到原來的80%,代碼如下:
import cv2
img = cv2.imread("1.jpg") # 讀取圖像
rows = len(img) # 圖像像素行數(shù)
cols = len(img[0]) # 圖像像素列數(shù)
center = (rows / 2, cols / 2) # 圖像的中心點(diǎn)
M = cv2.getRotationMatrix2D(center, 30, 0.8) # 以圖像為中心,逆時(shí)針旋轉(zhuǎn)30度,縮放0.8倍
dst = cv2.warpAffine(img, M, (cols, rows)) # 按照M進(jìn)行仿射
cv2.imshow("img", img) # 顯示原圖
cv2.imshow("dst", dst) # 顯示仿射變換效果
cv2.waitKey() # 按下任何鍵盤按鍵后
cv2.destroyAllWindows() # 釋放所有窗體
?效果如圖所示:
🚀4.透視
如果說仿射是讓圖像在二維平面中變形,那么透視就是讓圖像在三維空間中變形。從不同的角度觀察物體,會(huì)看到不同的變形畫面。例如,矩陣會(huì)變成不規(guī)則的四邊形、直角會(huì)變成銳角或鈍角、圓形會(huì)變成橢圓等,這種變形之后的畫面就是透視圖。🌴
OpenCV通過warpPerspective()方法來實(shí)現(xiàn)透視效果,其語法如下:
dst = cv2.warpPerspective(src,M,dsize,flags,borderMode,borderValue)
參數(shù)說明:
src:原始圖像
M:一個(gè)3行3列的矩陣,根據(jù)此矩陣中的值變換原圖中的像素位置。
dsize:輸出圖像的尺寸大小
flags:可選參數(shù),插值方式,建議使用默認(rèn)值。
borderMode:可選參數(shù),邊界類型,建議使用默認(rèn)值。
borderValue:可選參數(shù),邊界值,默認(rèn)為0,建議使用默認(rèn)值。
返回值說明:
dst:經(jīng)過透視變換后輸出圖像
warpPerspective()方法也需要通過M矩陣來計(jì)算透視效果,但得出這個(gè)矩陣需要做很復(fù)雜的運(yùn)算,于是OpenCV提供了getPerspectiveTransform()方法來自動(dòng)計(jì)算M矩陣。getPerspectiveTransform()方法的語法格式如下所示:
M = cv2.getPerspectiveTransform(src,dst)
參數(shù)說明:
src:原圖四個(gè)點(diǎn)坐標(biāo),格式為4行2列的32位浮點(diǎn)數(shù)列表,例如:[[0,0],[1,0],[0,1],[1,1]]。
dst:透視圖的四個(gè)點(diǎn)坐標(biāo),格式與src一樣。
返回值說明:
M:方法計(jì)算出的仿射矩陣
🍀模擬從底部觀察圖像得到的透視效果,將圖像頂部邊緣收窄,底部邊緣保持不變,代碼如下:
import cv2
import numpy as np
img = cv2.imread("1.jpg") # 讀取圖像
rows = len(img) # 圖像像素行數(shù)
cols = len(img[0]) # 圖像像素列數(shù)
p1 = np.zeros((4, 2), np.float32) # 32位浮點(diǎn)型空列表,保存原圖四個(gè)點(diǎn)
p1[0] = [0, 0] # 左上角點(diǎn)坐標(biāo)
p1[1] = [cols - 1, 0] # 右上角點(diǎn)坐標(biāo)
p1[2] = [0, rows - 1] # 左下角點(diǎn)坐標(biāo)
p1[3] = [cols - 1, rows - 1] # 右下角點(diǎn)坐標(biāo)
p2 = np.zeros((4, 2), np.float32) # 32位浮點(diǎn)型空列表,保存透視圖四個(gè)點(diǎn)
p2[0] = [90, 0] # 左上角點(diǎn)坐標(biāo),向右移動(dòng)90像素
p2[1] = [cols - 90, 0] # 右上角點(diǎn)坐標(biāo),向左移動(dòng)90像素
p2[2] = [0, rows - 1] # 左下角點(diǎn)坐標(biāo),位置不變
p2[3] = [cols - 1, rows - 1] # 右下角點(diǎn)坐標(biāo),位置不變
M = cv2.getPerspectiveTransform(p1, p2) # 根據(jù)四個(gè)點(diǎn)的變化軌跡計(jì)算出M矩陣
dst = cv2.warpPerspective(img, M, (cols, rows)) # 按照M進(jìn)行仿射
cv2.imshow('img', img) # 顯示原圖
cv2.imshow('dst', dst) # 顯示仿射變換效果
cv2.waitKey() # 按下任何鍵盤按鍵后
cv2.destroyAllWindows() # 釋放所有窗體
?效果如圖所示: