溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

OpenCV中常用圖像幾何變換有哪些

發(fā)布時(shí)間:2021-12-13 17:08:13 來(lái)源:億速云 閱讀:159 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要為大家展示了“OpenCV中常用圖像幾何變換有哪些”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“OpenCV中常用圖像幾何變換有哪些”這篇文章吧。

0 程序環(huán)境與所學(xué)函數(shù)

本章程序運(yùn)行需要導(dǎo)入下面三個(gè)庫(kù),并定義了一個(gè)顯示圖像的函數(shù)

所學(xué)函數(shù)

##放大、縮小
cv.resize(img,dsize,[interpolation])
##平移變換
M = np.array([[...]], dtype=np.float32)
cv.warpAffine(img, M, dsize)
##鏡像變換
cv.flip(img, 1) # 垂直鏡像
cv.flip(img, 0) # 水平鏡像
cv.flit(img, -1) # 水平垂直同時(shí)進(jìn)行
##旋轉(zhuǎn)變換
M = cv.getRotationMatrix2D(center, angle, scale)
img_rotate = cv.rotate(img, cv.ROTATE_90_CLOCKWISE)
##透視變換
M = cv.getPerspectiveTransform(src, dst)
img = cv.warpPerspective(img, M, dsize)

1 裁剪、放大、縮小

讀入圖像

img =  cv.imread('pic/rabbit500x333.jpg')
show(img)

顯示

OpenCV中常用圖像幾何變換有哪些

裁剪:數(shù)組選擇方法(冒號(hào))

#裁剪
rabbit = img[150:450:] #限定行數(shù),列數(shù)和三通道
show(rabbit)

顯示

OpenCV中常用圖像幾何變換有哪些

放大和縮小:resize()函數(shù)

插值方法

OpenCV中常用圖像幾何變換有哪些

程序?qū)崿F(xiàn)

#放大縮小
#cv.resize(img,dsize,[interpolation])  dsize表示大小,[interpolation]是插值方法,可選,有默認(rèn)值
img2 = cv.resize(img,(500,400))  #放大為寬500高400
#使用定義插值方法
#一般來(lái)說(shuō)放大地話選擇LINEAR方法,縮小選擇AREA方法
img3 = cv.resize(img,(500,400),interpolation=cv.INTER_NEAREST)
show(np.hstack([img2,img3]))

顯示

OpenCV中常用圖像幾何變換有哪些

2 平移變換

原理、平移矩陣推導(dǎo)

OpenCV中常用圖像幾何變換有哪些

讀入圖像

img = cv.imread('pic/rabbit500x333.jpg')
show(img)

顯示

OpenCV中常用圖像幾何變換有哪些

程序?qū)崿F(xiàn)

# M = np.array([[...]],dtype=np.float32) 
# cv.warAffine(img,M,dsize) cv里面圖像仿射變換函數(shù),M是上面矩陣,dsize是輸出圖像大小
M=np.array([
    [1,0,100],
    [0,1,50]
],dtype=np.float32)  #水平向右平移100個(gè)像素點(diǎn),豎直向下平移50個(gè)像素點(diǎn),原理見理論部分
 
img2 = cv.warpAffine(img,M,(333,500))
show(img2)

顯示

OpenCV中常用圖像幾何變換有哪些

3 錯(cuò)切變換

原理、錯(cuò)切矩陣推導(dǎo)

OpenCV中常用圖像幾何變換有哪些

OpenCV中常用圖像幾何變換有哪些

讀入圖像

img = cv.imread('pic/rabbit500x333.jpg')
show(img)

顯示

OpenCV中常用圖像幾何變換有哪些

水平錯(cuò)切

M = np.array([
    [1,0.2,0],
    [0,1,0]
],dtype=np.float32)
 
img3 = cv.warpAffine(img,M,(533,500))
show(img3)

顯示

OpenCV中常用圖像幾何變換有哪些

垂直錯(cuò)切

M = np.array([
    [1,0,0],
    [0.3,1,0]
],dtype=np.float32)
 
img3 = cv.warpAffine(img,M,(333,700))
show(img3)

顯示

OpenCV中常用圖像幾何變換有哪些

4 鏡像變換

原理、鏡像矩陣推導(dǎo)

OpenCV中常用圖像幾何變換有哪些

讀入圖像

img = cv.imread('pic/rabbit500x333.jpg')
show(img)

顯示

OpenCV中常用圖像幾何變換有哪些

水平鏡像

Mx = np.array([
    [-1,0,333],
    [0,1,0]
],dtype = np.float32)
img2 = cv.warpAffine(img,Mx,(333,500))  #仿射變換函數(shù)
show(img2)

顯示

OpenCV中常用圖像幾何變換有哪些

垂直鏡像

My = np.array([
    [1,0,0],
    [0,-1,500]
],dtype=np.float32)
 
img3 = cv.warpAffine(img,My,(333,500))
show(img3)

顯示

OpenCV中常用圖像幾何變換有哪些

opencv內(nèi)置函數(shù)實(shí)現(xiàn)鏡像變換

#垂直鏡像 cv.flip(img,1)

#水平鏡像 cv.flip(img,0)

#水平垂直同時(shí)進(jìn)行 cv.flip(img,-1)

程序?qū)崿F(xiàn)

img4 = cv.flip(img,1)  #垂直鏡像
img5 = cv.flip(img,0)  #水平鏡像
img6 = cv.flip(img,-1) #水平垂直鏡像同時(shí)進(jìn)行
 
show(np.hstack([img4,img5,img6]))

顯示

OpenCV中常用圖像幾何變換有哪些

5 旋轉(zhuǎn)變換

原理、旋轉(zhuǎn)矩陣推導(dǎo)

OpenCV中常用圖像幾何變換有哪些

OpenCV中常用圖像幾何變換有哪些

讀入圖像

img = cv.imread('pic/rabbit500x333.jpg')
show(img)

顯示

OpenCV中常用圖像幾何變換有哪些

圖像旋轉(zhuǎn)

beta = np.pi/4
#旋轉(zhuǎn)矩陣
M  = np.array([
    [np.cos(beta),np.sin(beta),0],
    [-np.sin(beta),np.cos(beta),0]
],dtype=np.float32)
 
img2 = cv.warpAffine(img,M,(633,300))
show(img2)

顯示

OpenCV中常用圖像幾何變換有哪些

opencv內(nèi)置獲取旋轉(zhuǎn)矩陣函數(shù):

M = cv.getRotationMatrix2D(center,angle,scale)  

center是旋轉(zhuǎn)中心,angle是旋轉(zhuǎn)角度,scale表示放大還是縮小

用上面函數(shù)獲取旋轉(zhuǎn)矩陣并實(shí)現(xiàn)圖像旋轉(zhuǎn)

h,w,c = img.shape  #獲取圖像的高度和寬度,方便后面設(shè)置旋轉(zhuǎn)中心
 
M2 = cv.getRotationMatrix2D((w//2,h//2),45,1)
img3 = cv.warpAffine(img,M2,(533,500))  #仿射函數(shù)實(shí)現(xiàn)
show(img3

顯示

OpenCV中常用圖像幾何變換有哪些

opencv內(nèi)置實(shí)現(xiàn)圖像旋轉(zhuǎn)函數(shù)

img_rotate =cv.rotate(img,cv.ROTATE_90_COUNTERCLOCKWISE)

只能進(jìn)行90度倍數(shù)的旋轉(zhuǎn)

程序?qū)崿F(xiàn)

# 逆時(shí)針旋轉(zhuǎn)90度
img_rotate = cv.rotate(img,cv.ROTATE_90_COUNTERCLOCKWISE)
show(img_rotate)

顯示

OpenCV中常用圖像幾何變換有哪些

6 透視變換

M = cv.getPerspectiveTransform(str,dst)

str:原始圖像矩陣端點(diǎn)位置,dst:目標(biāo)圖像矩陣位置

img2 = cv.warpPerspective(img,M,(w,h))

讀入圖像

img = cv.imread('pic/parthenon500x750.jpg')
show(img)

顯示

OpenCV中常用圖像幾何變換有哪些

程序?qū)崿F(xiàn)

#在原圖中定位四個(gè)點(diǎn),這里找的是柱子前面四個(gè)點(diǎn)的大概位置,眼睛觀察法找的
str = np.array([
    [210,50],
    [610,270],
    [650,470],
    [150,450]
],dtype=np.float32)
 
#目標(biāo)圖像中矩陣
dst = np.array([
    [150,50],
    [650,50],
    [650,470],
    [150,470]
],dtype=np.float32)
 
h,w,c = img.shape
 
#透視變換將一個(gè)類似矩形的圖形拉成一個(gè)矩形
M = cv.getPerspectiveTransform(str,dst)
img2 = cv.warpPerspective(img,M,(w,h))
show(img2)

顯示

OpenCV中常用圖像幾何變換有哪些

應(yīng)用:車道檢測(cè)、圖片矯正

7 最近鄰插值、雙線性插值

原理:

OpenCV中常用圖像幾何變換有哪些

最近鄰插值圖示:

OpenCV中常用圖像幾何變換有哪些

雙線性插值圖示

OpenCV中常用圖像幾何變換有哪些

讀入圖像

img = cv.imread('pic/rabbit50x33.jpg')
show(img)

顯示

OpenCV中常用圖像幾何變換有哪些

程序?qū)崿F(xiàn)

img1 = cv.resize(img,(330,500),interpolation=cv.INTER_NEAREST) #最近鄰插值
img2 = cv.resize(img,(330,500),interpolation=cv.INTER_LINEAR_EXACT) #精確雙線新插值
 
show(np.hstack([img1,img2]))

顯示

OpenCV中常用圖像幾何變換有哪些

可以看出最近鄰插值還是比較模糊的,過渡結(jié)果沒有雙線性插值平滑

以上是“OpenCV中常用圖像幾何變換有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI