Python OpenCV圖像處理與深度學習:Python OpenCV圖像幾何變換入門

圖像變換:掌握OpenCV中的幾何變換

學習目標

通過本課程,學員們將能夠理解圖像的幾何變換原理,包括縮放、旋轉和平移,并能夠使用Python和OpenCV庫實現這些變換。本課程將通過理論講解與實踐操作相結合的方式,幫助學員們掌握圖像處理的基礎技能。

相關知識點

  • Python OpenCV圖像變換

學習內容

1 Python OpenCV圖像變換

1.1 圖像縮放

圖像縮放是圖像處理中最基本的操作之一,它涉及到改變圖像的大小。在OpenCV中,可以使用cv2.resize()函數來實現圖像的縮放。縮放圖像時,可以指定新的圖像尺寸,也可以指定縮放比例。縮放比例可以是放大也可以是縮小,這取決于比例系數的大小。

1.1.1 理論知識

圖像縮放的基本原理是通過插值算法來估計新圖像中每個像素的值。插值算法的選擇會影響縮放后的圖像質量。常見的插值算法包括最近鄰插值、雙線性插值和雙三次插值。最近鄰插值算法簡單快速,但可能會導致圖像質量下降;雙線性插值和雙三次插值算法雖然計算復雜度較高,但能夠提供更好的圖像質量。

在OpenCV中,cv2.resize()函數的參數包括源圖像、目標圖像的尺寸以及插值方法。插值方法可以通過指定interpolation參數來選擇,例如cv2.INTER_NEAREST(最近鄰插值)、cv2.INTER_LINEAR(雙線性插值)、cv2.INTER_CUBIC(雙三次插值)等。

1.1.2 實踐操作

執行以下指令獲取測試圖片。

wget https://model-community-picture.obs.cn-north-4.myhuaweicloud.com/ascend-zone/notebook_datasets/27ef5b722fa911f09b27fa163edcddae/example.jpg

下面是一個使用OpenCV進行圖像縮放的示例代碼:

import cv2
import matplotlib.pyplot as plt# 讀取圖像
image = cv2.imread('example.jpg')# 定義縮放比例
scale_percent = 50  # 縮小到50%
width = int(image.shape[1] * scale_percent / 100)
height = int(image.shape[0] * scale_percent / 100)
dim = (width, height)# 縮放圖像
resized = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)
# 顯示原始圖像和縮放后的圖像
# 將 BGR 格式轉換為 RGB 格式,以適配 matplotlib 的顯示
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
resized = cv2.cvtColor(resized, cv2.COLOR_BGR2RGB)
# 創建畫布和子圖(1行2列)
# 顯示第一張圖像
plt.subplot(1, 2, 1)  # 1行2列,第1個位置
plt.imshow(image)
plt.title('Original Image')
# 顯示第二張圖像
plt.subplot(1, 2, 2)  # 1行2列,第2個位置
plt.imshow(resized)
plt.title('Resized Image')
plt.tight_layout()  # 自動調整布局
plt.show()

在這里插入圖片描述

1.2 圖像旋轉

圖像旋轉是指將圖像繞著某個點(通常是圖像的中心點)旋轉一定的角度。在OpenCV中,可以使用cv2.getRotationMatrix2D()函數來獲取旋轉矩陣,然后使用cv2.warpAffine()函數來應用旋轉矩陣,實現圖像的旋轉。

1.2.1 理論知識

圖像旋轉的基本原理是通過旋轉矩陣來變換圖像中的每個像素。旋轉矩陣是一個2x3的矩陣,其中前兩列表示旋轉和平移,第三列表示平移。旋轉矩陣的計算公式為:

R=[cos?(θ)?sin?(θ)0sin?(θ)cos?(θ)0001]R = \begin{bmatrix} \cos(\theta) & -\sin(\theta) & 0 \\ \sin(\theta) & \cos(\theta) & 0 \\ 0 & 0 & 1 \end{bmatrix}R=?cos(θ)sin(θ)0??sin(θ)cos(θ)0?001??

其中,θ\thetaθ 是旋轉角度。為了確保旋轉后的圖像不會被裁剪,通常需要計算旋轉后的圖像尺寸,并在旋轉矩陣中加入平移部分。

1.2.2 實踐操作

下面是一個使用OpenCV進行圖像旋轉的示例代碼:

import cv2
import numpy as np# 讀取圖像
image = cv2.imread('example.jpg')# 獲取圖像的中心點
(h, w) = image.shape[:2]
center = (w // 2, h // 2)# 定義旋轉角度和縮放比例
angle = 45  # 旋轉45度
scale = 1.0  # 保持原大小# 獲取旋轉矩陣
M = cv2.getRotationMatrix2D(center, angle, scale)# 應用旋轉矩陣
rotated = cv2.warpAffine(image, M, (w, h))
# 顯示原始圖像和旋轉后的圖像
# 將 BGR 格式轉換為 RGB 格式,以適配 matplotlib 的顯示
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
rotated = cv2.cvtColor(rotated, cv2.COLOR_BGR2RGB)
# 創建畫布和子圖(1行2列)
# 顯示第一張圖像
plt.subplot(1, 2, 1)  # 1行2列,第1個位置
plt.imshow(image)
plt.title('Original Image')
plt.axis('off')
# 顯示第二張圖像
plt.subplot(1, 2, 2)  # 1行2列,第2個位置
plt.imshow(rotated)
plt.title('Rotated Image')
plt.axis('off')
plt.tight_layout()  # 自動調整布局
plt.show()
1.3 圖像平移

圖像平移是指將圖像中的所有像素沿水平和垂直方向移動一定的距離。在OpenCV中,可以使用cv2.warpAffine()函數來實現圖像的平移。平移矩陣是一個2x3的矩陣,其中前兩列表示平移距離,第三列表示平移。

1.3.1 理論知識

圖像平移的基本原理是通過平移矩陣來變換圖像中的每個像素。平移矩陣的計算公式為:

T=[10tx01ty001] T = \begin{bmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \end{bmatrix} T=?100?010?tx?ty?1??

其中,txt_xtx?tyt_yty? 分別是水平和垂直方向的平移距離。平移矩陣可以直接用于cv2.warpAffine()函數,實現圖像的平移。

1.3.2 實踐操作

下面是一個使用OpenCV進行圖像平移的示例代碼:

import cv2
import numpy as np# 讀取圖像
image = cv2.imread('example.jpg')# 定義平移距離
tx = 100  # 水平方向平移100像素
ty = 50   # 垂直方向平移50像素# 構建平移矩陣
M = np.float32([[1, 0, tx], [0, 1, ty]])# 應用平移矩陣
translated = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))
# 顯示原始圖像和平移后的圖像
# 將 BGR 格式轉換為 RGB 格式,以適配 matplotlib 的顯示
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
translated = cv2.cvtColor(translated, cv2.COLOR_BGR2RGB)
# 創建畫布和子圖(1行2列)
# 顯示第一張圖像
plt.subplot(1, 2, 1)  # 1行2列,第1個位置
plt.imshow(image)
plt.title('Original Image')
plt.axis('off')
# 顯示第二張圖像
plt.subplot(1, 2, 2)  # 1行2列,第2個位置
plt.imshow(translated)
plt.title('Translated Image')
plt.axis('off')
plt.tight_layout()  # 自動調整布局
plt.show()

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/95124.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/95124.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/95124.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Redis Windows 7.0.5 安裝教程(附exe/msi下載+環境配置+命令測試)

?第一步:下安裝包? 打開瀏覽器(比如 Edge 或 Chrome),復制這個鏈接到地址欄敲回車: https://pan.quark.cn/s/31912e0d0443 進去后往下翻,找名字帶 ?**redis-7.0.5? 的文件,?選那個 .exe 結…

數據結構(單鏈表)

目錄 1.鏈表的概念及結構 2.單鏈表的應用 2.1 打印鏈表 2.2申請新節點 2.3插入(尾刪和頭刪) 2.4刪除(尾刪和頭刪) 2.5查找 2.6任意位置插入 2.7刪除指定位置的元素 2.8 銷毀鏈表 3.總結 1.鏈表的概念及結構 &#xff…

電腦沒加域卻能獲取到IP地址

企業網絡管理的核心邏輯!電腦沒加域卻能獲取到IP地址,這完全是一種刻意為之的安全設計,而不是網絡故障。 簡單來說就是:“給你IP,但不給你權限。” 這背后是一套完整的 網絡準入控制(NAC) 策略。…

Go語言入門學習筆記

📚 前言 歡迎學習Go語言!這份教材假設您是編程零基礎,從最基本的概念開始講解。Go語言(也稱為Golang)由Google開發,簡單、高效、并發能力強,適合后端開發、系統編程和云計算。 學習建議&#xf…

gradle安裝、配置環境變量、配置阿里源及idea 中配置gradle

下載gradle https://services.gradle.org/distributions/ 配置系統環境變量 新增GRADLE_HOME D:\Information_Technology\App\gradle-8.14.3-bin\gradle-8.14.3 新增GRADLE_USER_HOME D:\Information_Technology\App\gradleHouse 設置 path,新增一行 %GRADLE_…

C# FlaUI win 自動化框架,介紹

一、簡潔介紹 FlaUI 是一套基于 .NET 的 Windows 桌面應用自動化測試庫,支持 Win32、WinForms、WPF、UWP 等多種類型的應用。它基于微軟原生 UI Automation 庫,提供了更現代、易用的 API,適合自動化測試工程師和開發者實現高效、可維護的 UI …

命名空間級別應用 Pod 安全標準

🎯 命名空間級別應用 Pod 安全標準 一、創建 Kubernetes 集群(使用 kind) 使用 kind (Kubernetes IN Docker)快速創建一個本地集群: kind create cluster --name my-cluster驗證集群是否運行正常&#xff1…

Ubuntu 25.10 Snapshot4 發布。

Ubuntu 25.10 的第四個快照(Snapshot 4)已于 2025 年 8 月 28 日發布,供開發者和測試人員進行驗證。這是 Ubuntu 25.10 正式發布前的最后一個月度快照,標志著該版本已進入功能凍結階段,預計將在 10 月發布正式版。 Ca…

STM32F2/F4系列單片機解密和芯片應用介紹

STM32F2/F4系列單片機解密和芯片應用介紹STM32F2和STM32F4系列微控制器憑借其出色的性能、豐富的外設接口和強大的連接能力,在很多對計算能力和實時性有要求的領域都有應用。同時,芯片解密的價格因其型號、加密技術等因素差異較大。🧭 重要提…

250901-BookStack跨服務器從Rootless-Docker到Rootful-Docker的備份遷移及服務啟動

下面給你一套「可離線、最小停機」的遷移步驟,從 A(rootless)搬到 B(rootful)。思路是:停 A → 打包數據卷 → 傳到 B → 還原 → 用同版本鏡像啟動 → 驗證。整套操作不依賴公網,只用你已有的離…

(Redis)Redis 分布式鎖及改進策略詳解

一、為什么需要分布式鎖在單機應用中,synchronized 或 ReentrantLock 足以解決并發問題。但在 分布式系統 中,多臺服務器之間共享同一個資源時,如果沒有鎖,很可能出現 超賣、重復扣減、數據不一致 等問題。 因此,分布式…

Linux應用開發-windows,linux環境下相關工具

VS Code Remote - SSH 虛擬機部分的操作 sudo systemctl status sshsudo apt update sudo apt install openssh-server sudo systemctl start ssh sudo systemctl enable ssh # 設置開機自啟hostname -IVS Code部分的操作 安裝 Remote - SSH 插件 vscode右下角出現&#xff…

Java泛型通配符詳解:搞懂?/extends/super用法,避開集合操作踩坑點

上次跟你們聊了泛型的基礎用法,今天接著往下說 —— 泛型里還有個挺重要的概念叫 “通配符”,就是那個問號 “?”,很多人第一次見都懵:這玩意兒跟普通泛型有啥區別?為啥有時候非得用它不可?小索奇當初也卡…

EXCEL開發之路(二)跨表交互模擬—仙盟創夢IDE

在車輛租賃行業,數據的高效管理與分析對于企業的運營決策、資源調配及客戶服務優化至關重要。自建 Excel 實現多表統計交互,如同為行業裝上了效能驅動引擎,助力企業在復雜多變的市場環境中穩健前行。一、精準資源管理,優化車輛調配…

醫療AI時代的生物醫學Go編程:高性能計算與精準醫療的案例分析(八)

5.4 性能測試與結果分析 為了評估GoEHRStream的性能,我們設計測試模擬真實的醫院數據流場景,并測量關鍵指標。 5.4.1 實驗環境 硬件: CPU: Intel Xeon E-2288G (8 cores, 16 threads) RAM: 32 GB DDR4 Storage: 512 GB NVMe SSD (用于GoEHRStream和BadgerDB) Network: 1 G…

開關電源設計“反饋回路”部分器件分析

目錄 主要分析問題如下: 一、問題1 二、問題二 分析電路如下: 主要分析問題如下: 1、分析TL431芯片1、2兩引腳間并聯電阻和電容(RC電路)的作用? 2、PC817A光耦輸入兩個引腳間并聯電阻的作用?…

AI 編程新玩法:用 yunqi-saas-kit 框架制作小游戲,看廣告變現輕松賺錢?

AI 編程新玩法:用 yunqi-saas-kit 框架制作小游戲,看廣告變現輕松賺錢 在數字經濟快速發展的當下,AI 技術正不斷滲透到各個領域,其中 **#AI 編程憑借高效、便捷的優勢,成為不少開發者和創業者的新選擇。尤其是在小游戲…

Kafka 架構原理

一個kafka集群中包含一個或多個Producer、一個或多個broker、一個或多個ConsumerGrop以及一個Zookeeper集群。kafka通過Zookeeper管理kafka集群配置、leader副本的選舉、生產者的負載均衡等。Producer使用push模式將消息發布到broker,Consumer使用pull模式從broker訂閱并消費消…

用 PyTorch 搭建 CNN 實現 MNIST 手寫數字識別

在圖像識別領域,卷積神經網絡(CNN) 憑借其對空間特征的高效提取能力,成為手寫數字識別、人臉識別等任務的首選模型。而 MNIST(手寫數字數據集)作為入門級數據集,幾乎是每個深度學習學習者的 “第…

CTFshow系列——命令執行web61-68

本篇文章介紹了不同了方法進行題目的解析以及原因講解。 文章目錄Web61嘗試了一下,被過濾的payload如下:所以,根據上述思路,這里嘗試過的payload為:Web62(同Web61)Web63(同Web62&…