使用OpenCV實(shí)現(xiàn)圖像的透視變換功能
概述
在計(jì)算機(jī)視覺領(lǐng)域,經(jīng)常需要對圖像進(jìn)行各種幾何變換,如旋轉(zhuǎn)、縮放和平移等。其中,透視變換(Perspective Transformation)是一種非常重要的變換方式,它能夠模擬三維空間中的視角變化,例如從不同角度觀察同一個(gè)物體時(shí)所看到的不同效果。本文將詳細(xì)介紹如何使用 OpenCV 庫在 Python 中實(shí)現(xiàn)圖像的透視變換。
環(huán)境準(zhǔn)備
在開始之前,請確保已經(jīng)安裝了 OpenCV 庫。如果沒有安裝,可以通過以下命令進(jìn)行安裝:
pip install opencv-python
運(yùn)行效果
示例代碼詳解
import cv2 import numpy as np def func(): """ 讀取圖像并進(jìn)行透視變換。 :return: """ # 讀取圖像 img = cv2.imread('./resources/card.jpeg') print(type(img)) # 輸出圖像數(shù)據(jù)類型 print(img.shape) # 輸出圖像尺寸信息 # 定義目標(biāo)寬度和高度 width, height = 300, 200 # 原始圖像上的四個(gè)點(diǎn)坐標(biāo) pts1 = np.float32([ [94, 302], [205, 243], [152, 369], [265, 300] ]) # 目標(biāo)圖像上的四個(gè)點(diǎn)坐標(biāo) pts2 = np.float32([ [0, 0], [width, 0], [0, height], [width, height] ]) # 計(jì)算透視變換矩陣 matrix = cv2.getPerspectiveTransform(pts1, pts2) # 應(yīng)用透視變換 img_output = cv2.warpPerspective(img, matrix, (width, height)) # 展示原始圖像和變換后的圖像 cv2.imshow('Original Image', img) cv2.imshow('Transformed Image', img_output) # 等待用戶按鍵后退出 cv2.waitKey(0) if __name__ == '__main__': func()
代碼解析
導(dǎo)入必要的庫:
import cv2 import numpy as np
cv2:OpenCV 的 Python 接口。
numpy:用于處理圖像數(shù)據(jù)的數(shù)組。
定義函數(shù) func:
def func(): """ 讀取圖像并進(jìn)行透視變換。 :return: """
讀取圖像:
img = cv2.imread('./resources/card.jpeg') print(type(img)) # 輸出圖像數(shù)據(jù)類型 print(img.shape) # 輸出圖像尺寸信息
使用 cv2.imread() 讀取圖像文件。
print(type(img)) 和 print(img.shape) 分別用于檢查圖像數(shù)據(jù)類型和圖像尺寸。
定義目標(biāo)寬度和高度:
width, height = 300, 200
定義圖像上的四個(gè)點(diǎn)坐標(biāo):
pts1 = np.float32([ [94, 302], [205, 243], [152, 369], [265, 300] ])
pts1 表示在原始圖像上的四個(gè)點(diǎn)坐標(biāo),這些坐標(biāo)通常代表圖像中的某個(gè)矩形區(qū)域。
定義目標(biāo)圖像上的四個(gè)點(diǎn)坐標(biāo):
pts2 = np.float32([ [0, 0], [width, 0], [0, height], [width, height] ])
pts2 表示變換后目標(biāo)圖像上的四個(gè)點(diǎn)坐標(biāo),這里我們把原來的矩形區(qū)域拉伸成了一個(gè)矩形。
計(jì)算透視變換矩陣:
matrix = cv2.getPerspectiveTransform(pts1, pts2)
使用 cv2.getPerspectiveTransform() 獲取從原始圖像到目標(biāo)圖像的變換矩陣。
應(yīng)用透視變換:
img_output = cv2.warpPerspective(img, matrix, (width, height))
使用 cv2.warpPerspective() 應(yīng)用透視變換,得到變換后的圖像。
展示圖像:
cv2.imshow('Original Image', img) cv2.imshow('Transformed Image', img_output)
使用 cv2.imshow() 分別展示原始圖像和變換后的圖像。
等待用戶按鍵后退出:
cv2.waitKey(0)
cv2.waitKey(0) 使得程序等待用戶按鍵后退出。
獲取pts1數(shù)據(jù)的方式:
手動(dòng)選?。嚎梢允褂脠D像查看工具(例如Photoshop,GIMP等)打開圖像,然后手動(dòng)測量并記錄感興趣區(qū)域的四個(gè)角的像素坐標(biāo)。選取坐標(biāo)時(shí),確保它們形成一個(gè)閉合四邊形。
編程自動(dòng)識(shí)別:如果目標(biāo)區(qū)域的邊緣特征明顯,也可以使用圖像處理技術(shù)(如邊緣檢測、角點(diǎn)檢測等)自動(dòng)識(shí)別這些角點(diǎn),以便復(fù)用或動(dòng)態(tài)生成pts1的值。
實(shí)驗(yàn)和調(diào)整:在實(shí)際使用中,可能需要經(jīng)過幾次實(shí)驗(yàn)和調(diào)整,以獲取最佳的透視變換效果。
在這段代碼中,pts1的具體值:
pts1 = np.float32([ [94, 302], [205, 243], [152, 369], [265, 300] ])
這些坐標(biāo)值為示例數(shù)據(jù),意味著選擇了原圖中具體的一塊區(qū)域的四個(gè)點(diǎn),具體點(diǎn)的位置需要基于圖像的內(nèi)容而定。在實(shí)際應(yīng)用中,你會(huì)根據(jù)你希望進(jìn)行變換的區(qū)域選擇具體的坐標(biāo)。
總結(jié)
本文通過一個(gè)具體的代碼示例,詳細(xì)介紹了如何使用 OpenCV 在 Python 中實(shí)現(xiàn)圖像的透視變換。透視變換是一種強(qiáng)大的工具,可以幫助我們處理圖像中的非平行投影,從而在不同的視角下獲取一致的圖像。希望本文能幫助你在實(shí)際項(xiàng)目中更好地應(yīng)用這一技術(shù)。
以上就是使用OpenCV實(shí)現(xiàn)圖像的透視變換功能的詳細(xì)內(nèi)容,更多關(guān)于OpenCV圖像透視變換的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
django定期執(zhí)行任務(wù)(實(shí)例講解)
下面小編就為大家?guī)硪黄猟jango定期執(zhí)行任務(wù)(實(shí)例講解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11Python單體模式的幾種常見實(shí)現(xiàn)方法詳解
這篇文章主要介紹了Python單體模式的幾種常見實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Python單體模式的實(shí)現(xiàn)方法、原理與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-07-07python爬取網(wǎng)頁轉(zhuǎn)換為PDF文件
這篇文章主要為大家詳細(xì)介紹了python爬取網(wǎng)頁轉(zhuǎn)換為PDF文件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06關(guān)于PyTorch環(huán)境配置及安裝教程(Windows10)
這篇文章主要介紹了關(guān)于PyTorch環(huán)境配置及安裝教程(Windows10),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07python實(shí)現(xiàn)經(jīng)緯度采樣的示例代碼
這篇文章主要介紹了python實(shí)現(xiàn)經(jīng)緯度采樣的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12