Python使用OpenCV庫(kù)實(shí)現(xiàn)圖像幾何變化
引言
在圖像處理領(lǐng)域,幾何變換是一個(gè)非常重要的操作,它可以改變圖像的位置、大小、方向或形狀。在計(jì)算機(jī)視覺中,這些操作對(duì)于圖像預(yù)處理、特征提取和圖像增強(qiáng)至關(guān)重要。本文將介紹如何利用 Python 的 OpenCV 庫(kù)實(shí)現(xiàn)圖像的幾何變換,包括平移、旋轉(zhuǎn)、縮放、仿射變換和透視變換。
1. 什么是幾何變換?
幾何變換是通過數(shù)學(xué)變換將圖像的像素從一個(gè)位置映射到另一個(gè)位置的過程。根據(jù)變換的性質(zhì),可以將其分為以下幾類:
- 平移:移動(dòng)圖像位置。
- 縮放:調(diào)整圖像尺寸。
- 旋轉(zhuǎn):改變圖像方向。
- 仿射變換:對(duì)圖像進(jìn)行線性變換,包括平移、旋轉(zhuǎn)、縮放和傾斜。
- 透視變換:改變圖像的視角,使其產(chǎn)生三維效果。
2. OpenCV 幾何變換基本操作
2.1 平移
平移是將圖像沿 x 和 y 軸移動(dòng),公式如下:

在 OpenCV 中實(shí)現(xiàn):
import cv2
import numpy as np
# 讀取圖像
img = cv2.imread('image.jpg')
# 定義平移矩陣 [1, 0, tx] 和 [0, 1, ty]
tx, ty = 100, 50
M = np.float32([[1, 0, tx], [0, 1, ty]])
# 執(zhí)行平移變換
shifted = cv2.warpAffine(img, M, (img.shape[1], img.shape[0]))
cv2.imshow('Shifted Image', shifted)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.2 縮放
縮放是按比例放大或縮小圖像尺寸。在 OpenCV 中,使用 cv2.resize():
# 縮放圖像到指定大小 resized = cv2.resize(img, (300, 200)) # 按比例縮放 scaled = cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_LINEAR)
2.3 旋轉(zhuǎn)
旋轉(zhuǎn)變換公式:

在 OpenCV 中實(shí)現(xiàn):
(h, w) = img.shape[:2] center = (w // 2, h // 2) # 生成旋轉(zhuǎn)矩陣 angle = 45 scale = 1.0 M = cv2.getRotationMatrix2D(center, angle, scale) # 執(zhí)行旋轉(zhuǎn) rotated = cv2.warpAffine(img, M, (w, h))
2.4 仿射變換
仿射變換通過三個(gè)點(diǎn)的映射定義圖像變換。在 OpenCV 中使用 cv2.getAffineTransform():
# 定義原圖像和目標(biāo)圖像的三個(gè)點(diǎn) pts1 = np.float32([[50, 50], [200, 50], [50, 200]]) pts2 = np.float32([[10, 100], [200, 50], [100, 250]]) # 獲取仿射變換矩陣 M = cv2.getAffineTransform(pts1, pts2) # 執(zhí)行仿射變換 affined = cv2.warpAffine(img, M, (img.shape[1], img.shape[0]))
2.5 透視變換
透視變換通過四個(gè)點(diǎn)定義,可以改變圖像的視角:
# 定義原圖像和目標(biāo)圖像的四個(gè)點(diǎn) pts1 = np.float32([[56, 65], [368, 52], [28, 387], [389, 390]]) pts2 = np.float32([[0, 0], [300, 0], [0, 300], [300, 300]]) # 獲取透視變換矩陣 M = cv2.getPerspectiveTransform(pts1, pts2) # 執(zhí)行透視變換 warped = cv2.warpPerspective(img, M, (300, 300))
3. 實(shí)用技巧與注意事項(xiàng)
- 邊界處理:幾何變換可能會(huì)導(dǎo)致部分像素超出邊界,建議在設(shè)計(jì)時(shí)考慮圖像的大小。
- 插值方法:
cv2.INTER_NEAREST:最近鄰插值,速度快但效果較差。cv2.INTER_LINEAR:雙線性插值,適用于縮放。cv2.INTER_CUBIC:三次插值,適合高質(zhì)量變換。
- 變換順序:如果需要同時(shí)進(jìn)行多個(gè)幾何變換(如旋轉(zhuǎn)后平移),可以通過矩陣乘法將多個(gè)變換合并。
4. 應(yīng)用場(chǎng)景
- 圖像校正:修正拍攝中的傾斜、畸變。
- 特征對(duì)齊:人臉識(shí)別中常用仿射變換將人臉對(duì)齊。
- 數(shù)據(jù)增強(qiáng):通過隨機(jī)幾何變換擴(kuò)展數(shù)據(jù)集,用于訓(xùn)練深度學(xué)習(xí)模型。
- 視覺特效:制作圖像的動(dòng)態(tài)效果或藝術(shù)處理。
5. 總結(jié)
幾何變換是圖像處理中不可或缺的工具,OpenCV 提供了高效的方法來(lái)實(shí)現(xiàn)各種變換操作。在理解每種變換的數(shù)學(xué)原理后,可以根據(jù)應(yīng)用場(chǎng)景靈活組合這些技術(shù),從而完成更復(fù)雜的圖像處理任務(wù)。希望這篇文章能夠幫助你更好地掌握 Python + OpenCV 中的幾何變換操作!
以上就是Python使用OpenCV庫(kù)實(shí)現(xiàn)圖像幾何變化的詳細(xì)內(nèi)容,更多關(guān)于Python OpenCV圖像幾何變化的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python運(yùn)行中頻繁出現(xiàn)Restart提示的解決辦法
在編程的世界里,遇到各種奇怪的問題是家常便飯,但是,當(dāng)你的 Python 程序在運(yùn)行過程中頻繁出現(xiàn)“Restart”提示時(shí),這可能不僅僅是令人頭疼的小問題,而是隱藏著深層次的原因,本文將深入探討這一現(xiàn)象,并提供解決方案,需要的朋友可以參考下2025-04-04
python pip安裝的包放在哪個(gè)目錄(site-packages目錄的位置)
這篇文章主要介紹了python pip安裝的包放在哪個(gè)目錄(site-packages目錄的位置),通常安裝在python安裝目錄下的lib/site-packages目錄下,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06
Python Django教程之實(shí)現(xiàn)待辦事項(xiàng)應(yīng)用程序
Django是一個(gè)基于Python Web框架的高級(jí)Web框架,允許快速開發(fā)和干凈,務(wù)實(shí)的設(shè)計(jì)。本文將創(chuàng)建一個(gè)待辦事項(xiàng)應(yīng)用程序,以了解Django的基礎(chǔ)知識(shí),感興趣的可以嘗試一下2022-10-10
python實(shí)現(xiàn)串口自動(dòng)觸發(fā)工作的示例
今天小編就為大家分享一篇python實(shí)現(xiàn)串口自動(dòng)觸發(fā)工作的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2019-07-07
微信公眾號(hào)腳本-獲取熱搜自動(dòng)新建草稿并發(fā)布文章
本來(lái)想寫一個(gè)自動(dòng)化發(fā)布微信公眾號(hào)的小綠書的腳本,但是微信公眾號(hào)官網(wǎng)沒有小綠書的接口,那就寫一個(gè)獲取熱搜微信普通文章的腳本吧,這篇文章主要介紹了微信公眾號(hào)腳本-獲取熱搜自動(dòng)新建草稿并發(fā)布文章2025-04-04
TensorFlow教程Softmax邏輯回歸識(shí)別手寫數(shù)字MNIST數(shù)據(jù)集
這篇文章主要為大家介紹了python神經(jīng)網(wǎng)絡(luò)的TensorFlow教程基于Softmax邏輯回歸識(shí)別手寫數(shù)字的MNIST數(shù)據(jù)集示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11
Python保存數(shù)據(jù)到文件的實(shí)現(xiàn)方式
這篇文章主要介紹了Python保存數(shù)據(jù)到文件的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11

