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

OpenCV實現(xiàn)常見的四種圖像幾何變換

 更新時間:2022年04月01日 09:48:10   作者:侯小啾  
這篇文章主要介紹了利用OpenCV實現(xiàn)的四種圖像幾何變換:縮放、翻轉(zhuǎn)、仿射變換及透視。文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編學習一下

準備圖片

選擇一張shape為(500,500,3)的梵高的《星月夜》以便示例。

1. 縮放 cv2.resize()方法

cv2.resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None)

src 原圖(的數(shù)組)

dsize: 輸出圖像的大小 格式:(a,b)。

設定dsize后就無需再設置fx和fy

fx 可選參數(shù) 水平方向縮放比

fy 可選參數(shù) 垂直方向縮放比

fx和fy不同于dsize,fx和fy是各是一個比值,如設為2,則表示放大2倍,設為1/2則表示縮小到原來的1/2

import cv2
img = cv2.imread("The_Starry_Night.jpg")

dst1 = cv2.resize(img, (200, 200))
dst2 = cv2.resize(img, (900, 900))
cv2.imshow("img", img)
cv2.imshow("dst1", dst1)
cv2.imshow("dst2", dst2)
cv2.waitKey()
cv2.destroyAllWindows()

執(zhí)行結(jié)果如圖所示,相比原圖,圖像得到了指定大小的縮小與放大。

使用fx和fy參數(shù),則需要手動把dsize設為None。

import cv2
img = cv2.imread("The_Starry_Night.jpg")  
# 將寬縮小到原來的1/3、高縮小到原來的1/2
dst3 = cv2.resize(img, None, fx=1 / 3, fy=1 / 2) 
# 將寬高擴大2倍
dst4 = cv2.resize(img, None, fx=2, fy=2)  
cv2.imshow("img", img)
cv2.imshow("dst3", dst3) 
cv2.imshow("dst4", dst4) 
cv2.waitKey() 
cv2.destroyAllWindows()  

結(jié)果呈現(xiàn):

2. 翻轉(zhuǎn) cv2.flip()方法

flip(src, flipCode, dst=None)

src 圖像(數(shù)組)

flipCode 翻轉(zhuǎn)代碼??梢允?,正數(shù),負數(shù)。0表示沿X軸(水平方向的軸)翻轉(zhuǎn)。1表示沿Y軸(豎直方向的軸)翻轉(zhuǎn)。

負數(shù)表示同時沿X軸和Y軸翻轉(zhuǎn)。

講原圖經(jīng)過著三種翻轉(zhuǎn)后,與原圖拼在一塊,呈現(xiàn)出了這種奇觀:

import cv2
img = cv2.imread("The_Starry_Night.jpg")
dst1 = cv2.flip(img, 0)
dst2 = cv2.flip(img, 1)
dst3 = cv2.flip(img, -1)
cv2.imshow("img", img)
cv2.imshow("dst1", dst1)
cv2.imshow("dst2", dst2)
cv2.imshow("dst3", dst3)
cv2.waitKey()
cv2.destroyAllWindows()

將翻轉(zhuǎn)結(jié)果放在同一張畫布中

import cv2
import numpy as np
img = cv2.imread("The_Starry_Night.jpg")
dst1 = cv2.flip(img, 0)
dst2 = cv2.flip(img, 1)
dst3 = cv2.flip(img, -1)
a, b, c = img.shape
canvas = np.ones((2 * a, 2 * b, c), np.uint8) * 255
canvas[0:b, 0:a] = img
canvas[b:2*b, 0:a] = dst1
canvas[0:b, a:2*a] = dst2
canvas[b:2*b, a:2*a] = dst3
cv2.imshow("pic", canvas)
cv2.waitKey()
cv2.destroyAllWindows()
# 保存圖片
# cv2.imwrite("final_pic", canvas)

結(jié)果呈現(xiàn):

3. 仿射變換 warpAffine()方法

常見的仿射變換有平移,旋轉(zhuǎn)和傾斜變換。

仿射變換使用cv2.warpAffine()方法完成

warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None)

src 原圖

M 是一個二行三列的矩陣,也稱仿射矩陣。warpAffine方法根據(jù)此矩陣的值來變換像素的位置。

M = [[a, b, c], [d, e, f]],則像素的變換公式為:

X = x × a + y × b + c

Y = x × d + y × e + f

其中x,y指原像素的x、y軸坐標。X,Y指變換后的X,Y坐標。

dsize 輸出圖像的尺寸。(不帶放縮,增大的部分用黑色色素(0)填充)

這三個參數(shù)是常用的參數(shù)。其余參數(shù)建議使用默認值。

flags表示插入方式,borderMode是邊界類型,borderValue表示邊界值(默認0)。dst表示反射變換后輸出的圖像。

3.1 平移

以將《星月夜》向左平移50個像素,向下平移100個像素為例。

則M數(shù)組應寫為[[1, 0, 50], [0, 1, 100]]:

import cv2
import numpy as np
img = cv2.imread("The_Starry_Night.jpg")
rows = len(img)
cols = len(img[0])
M = np.float32([[1, 0, 50],
                [0, 1, 100]]) 
dst = cv2.warpAffine(img, M, (cols, rows))
cv2.imshow("img", img) 
cv2.imshow("dst", dst) 
cv2.waitKey() 
cv2.destroyAllWindows()

如圖所示,圖像按照我們的預期成功被平移。

只是這樣得到的圖像有色素損失,我們丟失了超出畫布之外的數(shù)據(jù)。

為了避免損失,可以取設置dsize參數(shù)來控制輸出圖像的大小。

修改后的代碼如下:

import cv2
import numpy as np
img = cv2.imread("The_Starry_Night.jpg")
rows = len(img)
cols = len(img[0])
M = np.float32([[1, 0, 50],
                [0, 1, 100]])
dst = cv2.warpAffine(img, M, (cols+200, rows+200))
cv2.imshow("img", img)
cv2.imshow("dst", dst)
cv2.waitKey()
cv2.destroyAllWindows()

優(yōu)化后的程序執(zhí)行效果:

3.2 旋轉(zhuǎn)

旋轉(zhuǎn)也是通過M矩陣來實現(xiàn)的,這個矩陣的運算較復雜,

OpenCV提供了getRotationMatrix2D()方法來計算旋轉(zhuǎn)操作的M矩陣

getRotationMatrix2D(center, angle, scale)

center 指旋轉(zhuǎn)中心的坐標

angle指旋轉(zhuǎn)的角度

scale值縮放的比例。(旋轉(zhuǎn)過程支持縮放)

import cv2
img = cv2.imread("The_Starry_Night.jpg")
rows = len(img) 
cols = len(img[0]) 
center = (rows / 2, cols / 2) 
M = cv2.getRotationMatrix2D(center, 30, 0.8) 
dst = cv2.warpAffine(img, M, (cols, rows)) 
cv2.imshow("img", img) 
cv2.imshow("dst", dst) 
cv2.waitKey() 
cv2.destroyAllWindows()  

旋轉(zhuǎn)效果如圖所示:

3.3 傾斜

OpenCV需要定位到圖像的三個點的位置來計算傾斜效果,即左上角,右上角和左下角。

圖像的傾斜也是根據(jù)M矩陣實現(xiàn),得出矩陣的運算較復雜,通過getAffineTransform 方法實現(xiàn)。

語法

getAffineTransform(src, dst)

src是原圖像的左上角,右上角和左下角三個點的坐標。三維數(shù)組格式,形如[[a, b], [c, d], [e, f]]。

dst是傾斜后這三個點預期的坐標。格式同上。

要保持左上,右下,左下三個點的順序不能亂。

以將《星月夜》保持左下角和右上角坐標不變,左上角((0,0)處)向右移動150個像素長度。

代碼如下:

import cv2
import numpy as np
img = cv2.imread("The_Starry_Night.jpg")
rows = len(img)
cols = len(img[0])
p1 = np.array([[0, 0], [cols - 1, 0], [0, rows - 1]], dtype=np.float32)
p2 = np.array([[150, 0], [cols - 1, 0], [0, rows - 1]], dtype=np.float32)
M = cv2.getAffineTransform(p1, p2)
dst = cv2.warpAffine(img, M, (cols, rows))
cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()

程序執(zhí)行效果如下:

4. 透視

透視的實現(xiàn)使用的是warpPerspective()方法,而不再是用于平移、旋轉(zhuǎn)、傾斜的warpAffine()方法。

使用warpPerspective()方法也需要通過M矩陣來計算透視效果,計算透視的M矩陣可以使用getPerspectiveTransform()方法。

getPerspectiveTransform(src, dst, solveMethod=None)

該方法常用的參數(shù)有兩個,分別為原圖的四個點的坐標(scr) 和 透視后四個點的坐標(dst)。Opcv需要通過定位圖像的這四個點來計算透視效果。四個點依次為左上,右上,左下,右下。

坐標格式為二維數(shù)組格式,形如[[a, b],[c, d],[e, f],[g, h]]。

示例代碼如下:

import cv2
import numpy as np
img = cv2.imread("The_Starry_Night.jpg")
rows = len(img)
cols = len(img[0])
# 原圖的四點坐標
p1 = np.zeros((4, 2), np.float32)
p1[0] = [0, 0]
p1[1] = [cols - 1, 0]
p1[2] = [0, rows - 1]
p1[3] = [cols - 1, rows - 1]
# 透視后的四點坐標
p2 = np.zeros((4, 2), np.float32)
p2[0] = [150, 0]
p2[1] = [cols - 150, 0]
p2[2] = [0, rows - 1]  # 不變
p2[3] = [cols - 1, rows - 1]  # 不變
M = cv2.getPerspectiveTransform(p1, p2)
dst = cv2.warpPerspective(img, M, (cols, rows))
cv2.imshow('The_Starry_Night', img)
cv2.imshow('The_Starry_Night2', dst)
cv2.waitKey()
cv2.destroyAllWindows()

展示原圖和透視后的圖像效果:

到此這篇關于OpenCV實現(xiàn)常見的四種圖像幾何變換的文章就介紹到這了,更多相關OpenCV圖像幾何變換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Python中requests做接口測試的方法

    Python中requests做接口測試的方法

    Requests是一個很實用的Python HTTP客戶端庫,編寫爬蟲和測試服務器響應數(shù)據(jù)時經(jīng)常會用到,本文主要介紹了Python中requests做接口測試的方法,感興趣的可以了解一下
    2021-05-05
  • Python如何使用Requests下載文件并且顯示進度條

    Python如何使用Requests下載文件并且顯示進度條

    這篇文章主要為大家詳細介紹了如何使用?Requests?下載文件并且顯示進度條,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-12-12
  • Python 使用with上下文實現(xiàn)計時功能

    Python 使用with上下文實現(xiàn)計時功能

    with 語句適用于對資源進行訪問的場合,確保不管使用過程中是否發(fā)生異常都會執(zhí)行必要的“清理”操作,釋放資源,比如文件使用后自動關閉、線程中鎖的自動獲取和釋放等。這篇文章主要介紹了Python 使用with上下文實現(xiàn)計時,需要的朋友可以參考下
    2018-03-03
  • Python?pomegranate庫實現(xiàn)基于貝葉斯網(wǎng)絡拼寫檢查器

    Python?pomegranate庫實現(xiàn)基于貝葉斯網(wǎng)絡拼寫檢查器

    這篇文章主要為大家介紹了Python?pomegranate庫實現(xiàn)基于貝葉斯網(wǎng)絡拼寫檢查器示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪<BR>
    2023-04-04
  • Python中元組解構(gòu)的技巧詳解

    Python中元組解構(gòu)的技巧詳解

    在Python中,元組(tuple)是一種常用的數(shù)據(jù)結(jié)構(gòu),元組的解構(gòu)是一項強大的特性,快速、方便地將元組中的值分配給多個變量,下面我們就來學習一下Python中元組解構(gòu)的技巧吧
    2024-01-01
  • Matplotlib實戰(zhàn)之平行坐標系繪制詳解

    Matplotlib實戰(zhàn)之平行坐標系繪制詳解

    平行坐標系是一種統(tǒng)計圖表,它包含多個垂直平行的坐標軸,每個軸表示一個字段,并用刻度標明范圍,下面我們就來看看如何繪制平行坐標系吧
    2023-08-08
  • django框架ModelForm組件用法詳解

    django框架ModelForm組件用法詳解

    這篇文章主要介紹了django框架ModelForm組件用法,結(jié)合實例形式較為詳細的分析了Django框架ModelForm組件相關功能、原理、使用方法及操作注意事項,需要的朋友可以參考下
    2019-12-12
  • Pandas 透視表和交叉表的實現(xiàn)示例

    Pandas 透視表和交叉表的實現(xiàn)示例

    本文主要介紹了Pandas 透視表和交叉表的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-07-07
  • json跨域調(diào)用python的方法詳解

    json跨域調(diào)用python的方法詳解

    這篇文章主要介紹了json跨域調(diào)用python的方法,結(jié)合實例形式分析了基于ajax的json調(diào)用及Python后臺處理技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2017-01-01
  • Python調(diào)用jar包方法實現(xiàn)過程解析

    Python調(diào)用jar包方法實現(xiàn)過程解析

    這篇文章主要介紹了Python調(diào)用jar包方法實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08

最新評論

新平| 宁强县| 南宁市| 枝江市| 巴楚县| 遂宁市| 康乐县| 涡阳县| 广宁县| 东兰县| 会同县| 张家川| 米脂县| 林甸县| 南丹县| 会宁县| 海宁市| 海安县| 绥棱县| 鄂托克前旗| 临洮县| 汽车| 白水县| 图们市| 广平县| 兴业县| 济源市| 温州市| 沽源县| 山西省| 上林县| 克拉玛依市| 顺平县| 高邮市| 内乡县| 临潭县| 镇雄县| 金坛市| 新乡市| 丹东市| 云林县|