您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“OpenCV中常用圖像幾何變換有哪些”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“OpenCV中常用圖像幾何變換有哪些”這篇文章吧。
本章程序運(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)
讀入圖像
img = cv.imread('pic/rabbit500x333.jpg') show(img)
顯示
裁剪:數(shù)組選擇方法(冒號(hào))
#裁剪 rabbit = img[150:450:] #限定行數(shù),列數(shù)和三通道 show(rabbit)
顯示
放大和縮小:resize()函數(shù)
插值方法
程序?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]))
顯示
原理、平移矩陣推導(dǎo)
讀入圖像
img = cv.imread('pic/rabbit500x333.jpg') show(img)
顯示
程序?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)
顯示
原理、錯(cuò)切矩陣推導(dǎo)
讀入圖像
img = cv.imread('pic/rabbit500x333.jpg') show(img)
顯示
水平錯(cuò)切
M = np.array([ [1,0.2,0], [0,1,0] ],dtype=np.float32) img3 = cv.warpAffine(img,M,(533,500)) show(img3)
顯示
垂直錯(cuò)切
M = np.array([ [1,0,0], [0.3,1,0] ],dtype=np.float32) img3 = cv.warpAffine(img,M,(333,700)) show(img3)
顯示
原理、鏡像矩陣推導(dǎo)
讀入圖像
img = cv.imread('pic/rabbit500x333.jpg') show(img)
顯示
水平鏡像
Mx = np.array([ [-1,0,333], [0,1,0] ],dtype = np.float32) img2 = cv.warpAffine(img,Mx,(333,500)) #仿射變換函數(shù) show(img2)
顯示
垂直鏡像
My = np.array([ [1,0,0], [0,-1,500] ],dtype=np.float32) img3 = cv.warpAffine(img,My,(333,500)) show(img3)
顯示
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]))
顯示
原理、旋轉(zhuǎn)矩陣推導(dǎo)
讀入圖像
img = cv.imread('pic/rabbit500x333.jpg') show(img)
顯示
圖像旋轉(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內(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內(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)
顯示
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)
顯示
程序?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)
顯示
應(yīng)用:車道檢測(cè)、圖片矯正
原理:
最近鄰插值圖示:
雙線性插值圖示
讀入圖像
img = cv.imread('pic/rabbit50x33.jpg') show(img)
顯示
程序?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]))
顯示
可以看出最近鄰插值還是比較模糊的,過渡結(jié)果沒有雙線性插值平滑
以上是“OpenCV中常用圖像幾何變換有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(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)容。