最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

OpenCV+Python幾何變換的實(shí)現(xiàn)示例

 更新時(shí)間:2021年03月16日 09:43:04   作者:雨吹桐  
這篇文章主要介紹了OpenCV+Python幾何變換的實(shí)現(xiàn)示例,圖像的幾何變換是指將一幅圖像映射到另一幅圖像內(nèi)。有縮放、翻轉(zhuǎn)、仿射變換、透視、重映射等操作。感興趣的可以了解一下

幾何變換

圖像的幾何變換是指將一幅圖像映射到另一幅圖像內(nèi)。有縮放、翻轉(zhuǎn)、仿射變換、透視、重映射等操作。

1 縮放

使用cv2.resize()函數(shù)實(shí)現(xiàn)對(duì)圖像的縮放,但要注意cv2.resize()函數(shù)內(nèi)的dsize參數(shù)與原圖像的行列屬性是相反的,也就是:目標(biāo)圖像的行數(shù)是原始圖像的列數(shù),目標(biāo)圖像的列數(shù)是原始圖像的行數(shù)。

下面舉例說(shuō)明cv2.resize()函數(shù)的用法:

import cv2
img=cv2.imread('E:/python_opencv/tupian.jpg')
rows,cols=img.shape[0:2]  #行數(shù)和列數(shù)等于img的長(zhǎng)度和寬度
size=(int(cols*0.9),int(rows*0.5))  #比例:列變?yōu)樵瓉?lái)0.9倍,行變?yōu)?.5倍
rst=cv2.resize(img,size)  #將img按size比例縮放
print('img.shape=',img.shape)
print('rst.shape=',rst.shape)

運(yùn)行程序的結(jié)果如下:

img.shape=(600,60,3)
rst.shape=(300,54,3)

可以看出,行數(shù)變?yōu)樵瓉?lái)的0.5倍,列數(shù)變?yōu)樵瓉?lái)的0.9倍。代碼中size的行列位置發(fā)生了交換。

2 翻轉(zhuǎn)

使用cv2.flip()函數(shù)對(duì)圖像翻轉(zhuǎn),能夠?qū)崿F(xiàn)水平方向翻轉(zhuǎn)、垂直方向翻轉(zhuǎn)、兩個(gè)方向同時(shí)翻轉(zhuǎn)。

下面舉例說(shuō)明cv2.flip()函數(shù)的用法:

import cv2
img=cv2.imread('E:/python_opencv/tupian.jpg')
x=cv2.flip(img,0)   #圖x對(duì)原圖像繞x軸翻轉(zhuǎn)
y=cv2.flip(img,1)   #圖y對(duì)原圖像繞y軸翻轉(zhuǎn)
xy=cv2.flip(img,-1)  #圖xy對(duì)原圖像繞x軸y軸同時(shí)翻轉(zhuǎn)
cv2.imshow('img',img)
cv2.imshow('x',x)
cv2.imshow('y',y)
cv2.imshow('xy',xy)
cv2.waitKey()
cv2.destroyAllWindows()

程序運(yùn)行結(jié)果如下四幅圖,第一幅是原圖,第二幅是繞x軸翻轉(zhuǎn),第三幅是繞y軸翻轉(zhuǎn),第四幅是繞x軸y軸同時(shí)翻轉(zhuǎn)。

3 仿射

仿射變換是指圖像實(shí)現(xiàn)平移、旋轉(zhuǎn)等操作。

先設(shè)置一個(gè)變換矩陣M,然后使用cv2.warpAffine()函數(shù)對(duì)原圖像和變換矩陣M進(jìn)行仿射操作。

(一)平移

要實(shí)現(xiàn)圖像的平移,我們先自定義一個(gè)轉(zhuǎn)換矩陣,再進(jìn)行仿射平移變換。例程如下:

import cv2
import numpy as np
img=cv2.imread('E:\python_opencv/tupian.jpg')
height,width=img.shape[:2]     #讀取原圖像的長(zhǎng)和寬
x=100                      #自定義轉(zhuǎn)換矩陣M的x軸移動(dòng)值
y=200                      #自定義轉(zhuǎn)換矩陣M的y軸移動(dòng)值
M=np.float32([[1,0,x],[0,1,y]])    #構(gòu)造轉(zhuǎn)換矩陣M
move=cv2.warpAffine(img,M,(width,height))  #平移映射
cv2.imshow('orginal',img)
cv2.imshow('move',move)
cv2.waitKey()
cv2.destroyAllWindows()

程序運(yùn)行結(jié)果如下圖所示,左為原圖,右為平移后的圖。

(二)旋轉(zhuǎn)

使用函數(shù)cv2.getRotationMatrix2D()獲得轉(zhuǎn)移矩陣M,然后使用函數(shù)cv2.warpAffine()進(jìn)行仿射旋轉(zhuǎn)變換。例程如下:

import cv2
img=cv2.imread('E:\python_opencv/tupian.jpg')
height,width=img.shape[:2]  #讀取原圖像的長(zhǎng)和寬
M=cv2.getRotationMatrix2D((width/2,height/2),45,0.6)  #以中心為原點(diǎn),逆時(shí)針旋轉(zhuǎn)45°,且縮小為原圖的0.6倍,獲得轉(zhuǎn)移矩陣M
rotate=cv2.warpAffine(img,M,(width,height))  #旋轉(zhuǎn)映射
cv2.imshow('original',img)
cv2.imshow('rotation',rotate)
cv2.waitKey()
cv2.destroyAllWindows()

程序運(yùn)行結(jié)果如下圖所示,左為原圖,右為旋轉(zhuǎn)后的圖。

4 透視

透視變換是指將矩陣圖形投影到另一個(gè)視平面,可以映射為任意四邊形,所以透視變換也被稱(chēng)為投影映射(ProjectionMapping),并不是字面意義上的“透視”。透視與上節(jié)的仿射不同,仿射可以將矩陣映射為任意平行四邊形。

使用cv2.warpPerspective()函數(shù)實(shí)現(xiàn)透視變換。例程如下:

#完成圖像透視
import cv2
import numpy as np
img=cv2.imread('E:/python_opencv/tupian.jpg')
rows,cols=img.shape[:2]   #讀取原圖像的長(zhǎng)和寬
print(rows,cols)
#生成旋轉(zhuǎn)矩陣M
pts1=np.float32([[150,50],[400,50],[60,450],[310,450]])
pts2=np.float32([[50,50],[rows-50,50],[50,cols-50],[rows-50,cols-50]])
M=cv2.getPerspectiveTransform(pts1,pts2)
#使用函數(shù)cv2.warpPerspective()進(jìn)行透視變換
dst=cv2.warpPerspective(img,M,(cols,rows))
cv2.imshow('img',img)
cv2.imshow('dst',dst)
cv2.waitKey()
cv2.destroyAllWindows()

程序運(yùn)行結(jié)果如下圖所示,左為原圖,右為透視變換的圖。

我們可以看到,原圖片經(jīng)過(guò)透視映射后,變成另一個(gè)視角下的任意四邊形了。

5 重映射

重映射是修改了像素點(diǎn)的位置,從而生成一幅新的圖像,包括:復(fù)制、繞x軸y軸翻轉(zhuǎn),x軸y軸互換,圖像縮放等。

均使用cv2.remap()重映射函數(shù)進(jìn)行操作。

需要注意cv2.remap()中的兩個(gè)參數(shù)mapx、mapy。mapx表示對(duì)應(yīng)位置上x(chóng)軸坐標(biāo)值,mapy表示對(duì)應(yīng)位置上y軸坐標(biāo)值。

(一)復(fù)制

使用cv2.remap()函數(shù)完成圖像復(fù)制,需先定義mapx,mapy的值,然后循環(huán)映射每個(gè)像素點(diǎn)到對(duì)應(yīng)的位置上。

代碼如下:

import cv2
import numpy as np
img=cv2.imread('E:/python_opencv/tupian.jpg')
rows,cols=img.shape[:2]         #讀取行列數(shù)
mapx=np.zeros(img.shape[:2],np.float32) #mapx參數(shù)設(shè)定為對(duì)應(yīng)位置上的x軸坐標(biāo)值
mapy=np.zeros(img.shape[:2],np.float32) #mapy參數(shù)設(shè)定為對(duì)應(yīng)位置上的y軸坐標(biāo)值
for i in range(rows):          #對(duì)每個(gè)元素復(fù)制映射
  for j in range(cols):
    mapx.itemset((i,j),j)
    mapy.itemset((i,j),i)
rst=cv2.remap(img,mapx,mapy,cv2.INTER_LINEAR)
cv2.imshow('original',img)
cv2.imshow('result',rst)
cv2.waitKey()
cv2.destroyAllWindows()

執(zhí)行后結(jié)果如下所示,可以看到,實(shí)現(xiàn)了圖像的復(fù)制重映射。

(二)繞x軸翻轉(zhuǎn)

重映射法對(duì)圖像繞x軸翻轉(zhuǎn),表明mapx的值保持不變,mapy的值調(diào)整為總行數(shù)-1-當(dāng)前行號(hào),其余部分代碼不變,所以循環(huán)體內(nèi)代碼變?yōu)椋?/p>

 for i in range(rows):
   for j in range(cols):
     mapx.itemset((i,j),j)      #mapx的值保持不變
     mapy.itemset((i,j),rows-1-i)  #mapy的值調(diào)整為總行數(shù)-1-當(dāng)前行號(hào)

(三)繞y軸翻轉(zhuǎn)

重映射法對(duì)圖像繞y軸翻轉(zhuǎn),表明mapx的值調(diào)整為總行數(shù)-1-當(dāng)前列號(hào),mapy的值保持不變,所以循環(huán)體內(nèi)代碼變?yōu)椋?/p>

for i in range(rows):
  for j in range(cols): 
     mapx.itemset((i,j),cols-1-j)  #mapx的值調(diào)整為總列數(shù)-1-當(dāng)前列號(hào)
     mapy.itemset((i,j),i)      #mapy的值保持不變

(四)繞x軸y軸翻轉(zhuǎn)

重映射也能實(shí)現(xiàn)圖像繞x軸和y軸的同時(shí)翻轉(zhuǎn),只需將前兩個(gè)部分合并,使mapx的值調(diào)整為總行數(shù)-1-當(dāng)前列號(hào),mapy的值調(diào)整為總行數(shù)-1-當(dāng)前行號(hào)。例程如下:

import cv2
import numpy as np
img=cv2.imread('E:\python_opencv/tupian.jpg')
rows,cols=img.shape[:2]
mapx=np.zeros(img.shape[:2],np.float32)
mapy=np.zeros(img.shape[:2],np.float32)
for i in range(rows):
  for j in range(cols):
    mapx.itemset((i,j),cols-1-j)  #mapx的值調(diào)整為總列數(shù)-1-當(dāng)前列號(hào)
    mapy.itemset((i,j),rows-1-i)  #mapy的值調(diào)整為總行數(shù)-1-當(dāng)前行號(hào)
rst=cv2.remap(img,mapx,mapy,cv2.INTER_LINEAR)
cv2.imshow('original',img)
cv2.imshow('result',rst)
cv2.waitKey()
cv2.destroyAllWindows()

執(zhí)行后結(jié)果如下所示,可以看到,實(shí)現(xiàn)了圖像的繞x軸和y軸翻轉(zhuǎn)重映射過(guò)程。

(五)x軸、y軸互換

重映射中,x軸、y軸互換表明,mapx的值變?yōu)樗谛械男刑?hào),mapy的值變?yōu)樗诹械牧刑?hào)。

但當(dāng)行數(shù)和列數(shù)不一致時(shí),行或列無(wú)法完成映射的部分就被處理為0。示例代碼如下:

#使用函數(shù)cv2.remap()實(shí)現(xiàn)圖像繞x軸和y軸的互換
import cv2
import numpy as np
img=cv2.imread('E:\python_opencv/tupian.jpg')
rows,cols=img.shape[:2]
mapx=np.zeros(img.shape[:2],np.float32)
mapy=np.zeros(img.shape[:2],np.float32)
for i in range(rows):
  for j in range(cols):
    mapx.itemset((i,j),i)  #mapx的值變?yōu)樗谛械男刑?hào)
    mapy.itemset((i,j),j)  #mapy的值變?yōu)樗诹械牧刑?hào)
rst=cv2.remap(img,mapx,mapy,cv2.INTER_LINEAR)
cv2.imshow('original',img)
cv2.imshow('result',rst)
cv2.waitKey()
cv2.destroyAllWindows()

結(jié)果如圖:

可以看到,列數(shù)多于行數(shù)的部分被置為0(黑色)。

(六)圖像的縮放

重映射提供了cv2.remap()函數(shù)能夠?qū)崿F(xiàn)圖像的放大或縮小。處理圖像后,可以將圖像固定在圍繞其中心的某個(gè)區(qū)域。

下面例程中,x軸和y軸均縮小為原來(lái)的0.25-0.75倍之間。

import cv2
import numpy as np
img=cv2.imread('E:\python_opencv/tupian.jpg')
rows,cols=img.shape[:2]
mapx=np.zeros(img.shape[:2],np.float32)
mapy=np.zeros(img.shape[:2],np.float32)
for i in range(rows):
  for j in range(cols):
    if 0.25*cols < i < 0.75*cols and 0.25*rows < i < 0.75*rows:
      #在目標(biāo)圖像的x軸(0.25-0.75)倍之內(nèi)生成縮小圖像
      mapx.itemset((i,j),2*(j-0.25*cols)+0.5)
      #在目標(biāo)圖像的y軸(0.25-0.75)倍之內(nèi)生成縮小圖像
      mapy.itemset((i,j),2*(i-rows*0.25)+0.5)
    else:
      #不在上述區(qū)域的點(diǎn)都取(0,0)坐標(biāo)點(diǎn)的值
      mapx.itemset((i,j),0)
      mapy.itemset((i,j),0)
rst=cv2.remap(img,mapx,mapy,cv2.INTER_LINEAR)  #圖像縮放重映射
cv2.imshow('original',img)
cv2.imshow('result',rst)
cv2.waitKey()
cv2.destroyAllWindows()

到此這篇關(guān)于OpenCV+Python幾何變換的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)OpenCV 幾何變換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python帶參數(shù)打包exe及調(diào)用方式

    python帶參數(shù)打包exe及調(diào)用方式

    今天小編就為大家分享一篇python帶參數(shù)打包exe及調(diào)用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • Python3.4 splinter(模擬填寫(xiě)表單)使用方法

    Python3.4 splinter(模擬填寫(xiě)表單)使用方法

    今天小編就為大家分享一篇Python3.4 splinter(模擬填寫(xiě)表單)使用方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • 17個(gè)Python小技巧分享

    17個(gè)Python小技巧分享

    這篇文章主要給大家分享了17個(gè)Python小技巧,都是些基礎(chǔ)的非常常用也非常實(shí)用的小技巧,這里推薦給大家。
    2015-01-01
  • Python使用tkinter制作在線翻譯軟件

    Python使用tkinter制作在線翻譯軟件

    這篇文章主要為大家詳細(xì)介紹了Python使用tkinter制作在線翻譯軟件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • python可視化數(shù)據(jù)分析pyecharts初步嘗試

    python可視化數(shù)據(jù)分析pyecharts初步嘗試

    這篇文章主要為大家介紹了python可視化數(shù)據(jù)分析pyecharts初步嘗試,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • 使用python進(jìn)行廣告點(diǎn)擊率的預(yù)測(cè)的實(shí)現(xiàn)

    使用python進(jìn)行廣告點(diǎn)擊率的預(yù)測(cè)的實(shí)現(xiàn)

    這篇文章主要介紹了使用python進(jìn)行廣告點(diǎn)擊率的預(yù)測(cè)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • PythonWeb項(xiàng)目Django部署在Ubuntu18.04騰訊云主機(jī)上

    PythonWeb項(xiàng)目Django部署在Ubuntu18.04騰訊云主機(jī)上

    這篇文章主要介紹了PythonWeb項(xiàng)目Django部署在Ubuntu18.04騰訊云主機(jī)上的相關(guān)知識(shí),本文通過(guò)代碼加文字說(shuō)明的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2019-04-04
  • Python語(yǔ)言檢測(cè)模塊langid和langdetect的使用實(shí)例

    Python語(yǔ)言檢測(cè)模塊langid和langdetect的使用實(shí)例

    今天小編就為大家分享一篇關(guān)于Python語(yǔ)言檢測(cè)模塊langid和langdetect的使用實(shí)例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02
  • Django 如何獲取前端發(fā)送的頭文件詳解(推薦)

    Django 如何獲取前端發(fā)送的頭文件詳解(推薦)

    這篇文章主要介紹了Django 如何獲取前端發(fā)送的頭文件,先需要導(dǎo)入一個(gè)類(lèi)再通過(guò)request.environ來(lái)獲取,具體操作可查看下文,需要的朋友可以參考下
    2017-08-08
  • Python基礎(chǔ)知識(shí)之推導(dǎo)式詳解

    Python基礎(chǔ)知識(shí)之推導(dǎo)式詳解

    這篇文章主要介紹了Python基礎(chǔ)知識(shí)之推導(dǎo)式詳解,Python推導(dǎo)式是一種簡(jiǎn)潔高效的代碼編寫(xiě)方式,可以用一行代碼來(lái)創(chuàng)建列表、集合、字典等復(fù)雜數(shù)據(jù)結(jié)構(gòu),需要的朋友可以參考下
    2023-07-07

最新評(píng)論

晋江市| 宁武县| 长沙市| 丰台区| 上犹县| 南宁市| 洮南市| 荥阳市| 湘阴县| 苏州市| 九江市| 隆尧县| 盈江县| 武冈市| 神池县| 扶沟县| 香河县| 黄平县| 修武县| 于田县| 江西省| 陕西省| 类乌齐县| 阆中市| 北宁市| 连城县| 昌宁县| 右玉县| 成武县| 会宁县| 余江县| 福州市| 蓬安县| 通山县| 施甸县| 翼城县| 长白| 五台县| 吐鲁番市| 朔州市| 陇川县|