日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenCV_04 几何变换:图像缩放+图像平移+图像旋转+仿射变换+透射变换+图像金字塔

發(fā)布時間:2024/7/5 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV_04 几何变换:图像缩放+图像平移+图像旋转+仿射变换+透射变换+图像金字塔 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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:插值方法

  • import cv2 as cv # 1. 讀取圖片 img1 = cv.imread("./image/dog.jpeg") # 2.圖像縮放 # 2.1 絕對尺寸 rows,cols = img1.shape[:2] res = cv.resize(img1,(2*cols,2*rows),interpolation=cv.INTER_CUBIC)# 2.2 相對尺寸 res1 = cv.resize(img1,None,fx=0.5,fy=0.5)# 3 圖像顯示 # 3.1 使用opencv顯示圖像(不推薦) cv.imshow("orignal",img1) cv.imshow("enlarge",res) cv.imshow("shrink)",res1) cv.waitKey(0)# 3.2 使用matplotlib顯示圖像 fig,axes=plt.subplots(nrows=1,ncols=3,figsize=(10,8),dpi=100)axes[0].imshow(res[:,:,::-1]) axes[0].set_title("絕對尺度(放大)")axes[1].imshow(img1[:,:,::-1]) axes[1].set_title("原圖")axes[2].imshow(res1[:,:,::-1]) axes[2].set_title("相對尺度(縮小)") plt.show()

    結(jié)果:

    2 圖像平移

    圖像平移將圖像按照指定方向和距離,移動到相應(yīng)的位置。

  • API
  • cv.warpAffine(img,M,dsize)

    參數(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ù)。

    • 示例

    ##需求是將圖像的像素點移動(50,100)的距離:import numpy as np import cv2 as cv import matplotlib.pyplot as plt # 1. 讀取圖像 img1 = cv.imread("./image/image2.jpg")# 2. 圖像平移 rows,cols = img1.shape[:2] M = M = np.float32([[1,0,100],[0,1,50]])# 平移矩陣 dst = cv.warpAffine(img1,M,(cols,rows))# 3. 圖像顯示 fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(10,8),dpi=100)axes[0].imshow(img1[:,:,::-1]) axes[0].set_title("原圖")axes[1].imshow(dst[:,:,::-1]) axes[1].set_title("平移后結(jié)果") plt.show()

    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)

  • import numpy as np import cv2 as cv import matplotlib.pyplot as plt # 1 讀取圖像 img = cv.imread("./image/image2.jpg")# 2 圖像旋轉(zhuǎn) rows,cols = img.shape[:2] # 2.1 生成旋轉(zhuǎn)矩陣 M = cv.getRotationMatrix2D((cols/2,rows/2),90,1) # 2.2 進行旋轉(zhuǎn)變換 dst = cv.warpAffine(img,M,(cols,rows))# 3 圖像展示 fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(10,8),dpi=100) axes[0].imshow(img1[:,:,::-1]) axes[0].set_title("原圖") axes[1].imshow(dst[:,:,::-1]) axes[1].set_title("旋轉(zhuǎn)后結(jié)果") plt.show()

    反饋:

    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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 色婷婷麻豆 | 日韩二区 | 国产免费不卡 | 成年人网站免费看 | 国产网红主播精品av | 丁香一区二区三区 | 欧美综合亚洲 | 免费在线观看黄网 | 国产成人免费看一级大黄 | 99视频免费 | 精品视频在线观看一区二区 | 国产午夜毛片 | 亚洲熟女乱综合一区二区 | 黄页视频在线观看 | 人人干人人爽 | www av| 涩涩涩涩av| 色香蕉网站 | 亚洲精品66 | 中文字幕在线播放视频 | 一区二区三区在线观看免费 | 午夜资源站 | 国产毛片3 | 国产高h视频 | 国产精品久久久久无码av | 加勒比综合在线 | 青青久久av北条麻妃黑人 | 国内精品久久久久久久 | 日韩一区二 | 中文字幕av一区二区三区人妻少妇 | 久久大香 | 成人av小说 | 亚洲精品免费在线视频 | 电影寂寞少女免费观看 | 日本黄色片免费 | 视色av| 视频在线免费观看 | 亚洲精品在线免费播放 | a级一片| 裸体美女免费视频网站 | 黑白配av | 欧美大片高清免费观看 | 精品一区二区三区视频 | 欧美成人午夜视频 | 久久99精品久久久久久园产越南 | 欧美日韩午夜激情 | 97在线国产 | 国产91丝袜 | 亚洲一区二区三区久久久成人动漫 | 99性趣网 | 欧洲美熟女乱又伦 | 国产精彩视频在线观看 | 糖心视频在线 | 国产原创视频在线 | 免费伊人网 | 91亚瑟| 色先锋在线| 午夜一区二区三区免费观看 | 日批在线播放 | 在线不卡毛片 | 四虎影院永久地址 | 秋霞精品 | 在线观看免费视频黄 | 禁漫天堂黄漫画无遮挡观看 | 一区在线视频 | 91视频啊啊啊 | www.欧美成人 | 乱淫av| 午夜专区 | 亚洲综合伊人 | 色多多污污 | 综合色88 | 777久久| 亚洲一区二区在线视频 | 久久久久中文字幕亚洲精品 | 欧美怡红院视频一区二区三区 | 久久精品黄色 | 日本不卡一区二区三区 | 国产精品久久久久久久久久东京 | 久久综合丁香 | 天天摸天天干 | 成人免费看片98欧美 | 日韩欧美中文字幕精品 | 性生活视频播放 | 色婷久久 | 久久久精品影视 | jizz中国少妇 | 日韩伦理视频 | 久久久成人精品一区二区三区 | 福利小视频在线观看 | 欧洲成人免费视频 | 超碰777| 麻豆区1免费 | 七月丁香婷婷 | 米奇久久 | 国产成人精品一区二区三区四区 | 精品一区电影国产 | 国产中文字幕在线视频 | 黄色日韩|