圖像旋轉:從原理到 OpenCV 實踐

在圖像處理領域,圖像旋轉是一項基礎且重要的操作。它不僅可以改變圖像的方向,還在許多計算機視覺任務中發揮著關鍵作用,比如目標檢測、圖像配準等。本文將深入探討圖像旋轉的原理,并結合 OpenCV 庫提供具體的實現代碼。

一、圖像旋轉的原理

1. 單點旋轉

我們從最簡單的單點旋轉開始分析。假設旋轉中心為坐標系原點?\(O(0, 0)\),有一點?\(P_0(x_0, y_0)\),它繞原點順時針旋轉?\(\theta\)?角后得到點?\(P(x, y)\)。通過三角函數關系,我們可以推導出以下公式:

用矩陣表示為:

然而,在 OpenCV 中,旋轉中心是圖像的左上角,且逆時針為正方向,所以旋轉矩陣變為:

如果要圍繞任意點進行旋轉,我們需要先將旋轉點移到原點,進行旋轉操作,再將旋轉點移回原來的位置。這涉及到平移矩陣,最終得到的仿射變換矩陣為:

2. 圖片旋轉

圖像旋轉實際上就是將圖像中的每個像素點代入仿射變換矩陣,得到旋轉后的新坐標。在 OpenCV 中,我們可以使用?cv2.getRotationMatrix2D()?函數來獲取仿射變換矩陣,該函數需要三個參數:旋轉中心點?Center、旋轉角度?Angle?和縮放比例?Scale

3. 插值方法

在圖像旋轉過程中,由于三角函數的計算結果可能是小數,像素點旋轉后的取整結果可能會重合,導致部分原始像素信息丟失。同時,圖像縮放時也會出現像素點數量變化的問題。為了解決這些問題,我們需要使用插值方法來計算旋轉后圖像中每個像素點的像素值。常見的插值方法有以下幾種:

3.1 最近鄰插值(CV2.INTER_NEAREST

目標點與原圖像點之間坐標的計算公式為:

最近鄰插值的原則是目標像素點的像素值與計算出來的對應像素點的像素值相同,若出現小數部分則進行取整。

3.2 雙線性插值(CV2.INTER_LINEAR

雙線性插值是在水平和垂直方向上進行線性插值。假設要查找目標圖像上坐標為?(x', y')?的像素值,在原圖像上對應的浮點坐標為?(x, y),我們需要找到原圖像上最接近?(x, y)?的四個像素點,然后分別在水平和垂直方向上進行線性插值。為了解決坐標系不同和圖像位置偏移的問題,OpenCV 對公式進行了優化:

3.3 像素區域插值(cv2.INTER_AREA

像素區域插值在縮小圖像時會變成均值濾波器,對區域內的像素值取平均值;在放大圖像時,如果放大比例是整數倍,其工作原理與最近鄰插值類似,否則調用雙線性插值進行放大。

3.4 雙三次插值(cv2.INTER_CUBIC

雙三次插值需要原圖像中近鄰的 16 個點來加權,通過?BiCubic?基函數求出 16 個像素點的權重,目標圖像像素值等于這 16 個像素點的加權疊加。

3.5 Lanczos 插值(cv2.INTER_LANCZOS4

Lanczos 插值與雙三次插值思想類似,但需要原圖像周圍 8×8 的像素點,使用不同的權重公式計算權重。

4. 邊緣填充方式

在圖像旋轉后,可能會出現部分區域為空的情況,因此需要對這些區域進行填充。常見的邊緣填充方式有以下幾種:

  • 邊界復制(BORDER_REPLICATE:將邊界處的像素值進行復制,作為邊界填充的像素值。
  • 邊界反射(BORDER_REFLECT:根據原圖的邊緣進行反射。
  • 邊界反射 101(BORDER_REFLECT_101:與邊界反射不同,不再反射邊緣的像素點。
  • 邊界常數(BORDER_CONSTANT:指定一個常數值作為填充值,默認值為 0。
  • 邊界包裹(BORDER_WRAP:一種特殊的填充方式。

二、OpenCV 實現圖像旋轉

以下是使用 OpenCV 實現圖像旋轉的示例代碼:

import cv2def test001():img = cv2.imread("./opencv_work/src/rabbit.png")h, w, c = img.shapem = cv2.getRotationMatrix2D((h / 2, w / 2), 45, 2)img_rotate = cv2.warpAffine(img, m, (2 * w, 2 * h))cv2.imshow("img", img)cv2.imshow("img_rotate", img_rotate)cv2.waitKey(0)if __name__ == '__main__':test001()

在上述代碼中,我們首先使用?cv2.imread()?函數讀取圖像,然后使用?cv2.getRotationMatrix2D()?函數獲取仿射變換矩陣,最后使用?cv2.warpAffine()?函數進行圖像旋轉。

三、總結

圖像旋轉是圖像處理中的重要操作,理解其原理對于深入學習計算機視覺和圖像處理至關重要。OpenCV 提供了方便的函數來實現圖像旋轉,同時也支持多種插值方法和邊緣填充方式,我們可以根據具體需求選擇合適的方法。在實際應用中,我們需要綜合考慮計算速度和圖像質量,選擇最適合的參數。

希望本文能幫助你更好地理解圖像旋轉的原理和實現方法,歡迎在評論區留言交流。

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

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

相關文章

微服務架構下的抉擇:Consul vs. Eureka,服務發現該如何選型?

微服務架構下的抉擇:Consul vs. Eureka,服務發現該如何選型? 引言 想象一下,我們正在構建一個大型電商平臺。在“雙十一”大促期間,流量洪峰涌入,訂單服務、商品服務、用戶服務等都需要彈性伸縮&#xff…

基于Java+SpringBoot的寵物愛心組織管理系統

源碼編號:S572 源碼名稱:基于SpringBoot的寵物愛心組織管理系統 用戶類型:雙角色,用戶、管理員 數據庫表數量:15 張表 主要技術:Java、Vue、ElementUl 、SpringBoot、Maven 運行環境:Windo…

數字樣機:改寫衛星物聯網的研制范式

01. 衛星物聯網:技術邊界的自然延伸 隨著物聯網在城市、工業、農業等領域的廣泛部署,萬物互聯的愿景正在不斷逼近技術的邊界。尤其是在海洋、沙漠、高原、邊遠山區等傳統通信網絡難以覆蓋的區域,人們對無盲點物聯網連接的需求日益增強。這一…

springsecurity---使用流程、加密機制、自定義密碼匹配器、token字符串生成

目錄 權限控制 相關框架 SpringSecurity springsecurity使用流程 1、搭建環境實現默認用戶名和密碼登錄 2、使用數據庫表中定義好的用戶名和密碼訪問實現等值密碼匹配 1)sql文件 2)搭建jdbc或者mybatis或者mybatis-plus環境 3)配置mybatis-plus環…

在 Ubuntu 22.04 上使用 Minikube 部署 Go 應用到 Kubernetes

文章目錄 環境說明目標步驟與問題解決1. 構建 Go 應用和 Docker 鏡像問題 1:Go 依賴下載卡住問題 2:Docker 鏡像拉取失敗 2. 設置 Minikube 集群安裝 Minikube問題 3:Minikube 啟動失敗問題 4:Minikube 鏡像拉取失敗 3. 部署 Kube…

Android Studio-Git的使用指南

一、git的基本使用流程 git clone 克隆遠程資源到本地目錄,作為工作目錄;然后在本地的克隆目錄上添加或修改文件;如果遠程修改了,需要同步遠程的內容,直接git pull就可以更新本地的文件;本地在修改之后&…

【github】想fork的項目變為私有副本

在 GitHub 上,所有的 fork 都會繼承其上游倉庫(upstream)的可見性(visibility)設置: 可見性繼承 如果你 fork 的原倉庫是 public,那么你的 fork 也必須是 public。如果原倉庫是 private&#xf…

微軟發布新一代存儲優化型虛擬機:Azure Laosv4、Lasv4 和 Lsv4 系列

微軟宣布,全新一代存儲優化型虛擬機——Azure Laosv4、Lasv4 和 Lsv4 系列已正式面世。 與前一代虛擬機系列相比,全新的 L 系列虛擬機實現了重大突破。它支持高達 23TB 的本地 NVMe SSD,在 CPU、網絡以及遠程存儲性能方面均有顯著提升。該系…

python調用pybind11導出的pyd,出現UnicodeDecodeError

python調用pybind11導出的pyd,出現UnicodeDecodeError 1. 問題描述 舉個例子,當有以下C代碼以及Pybind11的綁定代碼時,在python訪問包含中文的Name和Value會有UnicodeDecodeError的異常! class VxUserProp{public:VxUserProp();…

MySQL別名在GROUP BY中的使用規則

-- 設置變量:SET earliest_date ... 用于定義并賦值一個用戶變量 earliest_date。 -- 用戶定義的變量必須以 符號開頭,例如 earliest_date。 -- 符號是MySQL中用戶變量的標識符,用于區分系統變量和用戶變量。 SET earliest_date (SELECT …

2025.7.4總結

感恩環節:感謝今日工作順利度過,明天終于能美美的睡個懶覺了。感謝這周有個美好的雙休。今日去實驗室參觀設備,感謝我的一個同事解答了我關于硬件設備與所做軟件業務之間的關系,通過控制器控制網元等相關設備,同時,雖然…

Prompt 精通之路(五)- 構建你的“AI 指令系統”:超越簡單提問的 CRISPE 與 APE 框架

🚀 Prompt 精通之路:系列文章導航 第一篇:[本文] AI 時代的新語言:到底什么是 Prompt?為什么它如此重要?第二篇:告別廢話!掌握這 4 個黃金法則,讓你的 Prompt 精準有效第…

#NFT藝術品哈希值唯一性與《民法典》“網絡虛擬財產”認定的沖突

首席數據官高鵬律師數字經濟團隊創作,AI輔助 一、當區塊鏈的「絕對唯一」遇上法律的「彈性空間」 每個NFT藝術品背后的哈希值,都像用數學密碼刻在區塊鏈上的指紋——世界上沒有任何兩個完全相同的編碼。這種由0和1構筑的「數字DNA」,被技術信…

【arXiv2025】計算機視覺|即插即用|LBMamba:革新視覺模型效率,性能炸裂

論文地址:https://arxiv.org/pdf/2506.15976 代碼地址:https://github.com/CiaoHe/bi-mamba 關注UP CV縫合怪,分享最計算機視覺新即插即用模塊,并提供配套的論文資料與代碼。 https://space.bilibili.com/473764881 摘要 Mamba…

【狂飆AGI】第7課:AGI-行業大模型(系列1)

目錄 (一)服裝史的GPT時刻(二)AI多學科診療系統(三)醫療大模型(四)生物醫藥大模型(五)教育大模型(六)心理大模型(七&#…

(LeetCode 每日一題) 3307. 找出第 K 個字符 II (位運算、數學)

題目&#xff1a;3307. 找出第 K 個字符 II 思路&#xff1a;位運算&#xff0c;時間復雜度0(logk)。 當2^(i-1) <k 且 2^i>k &#xff0c;說明k在K2^i的右半段 &#xff0c;k和其前半段的某個字符有關系 即當k>K時&#xff0c;k是由k-K位置上的字符變化而來&#xf…

國產MCU學習Day4——CW32F030C8T6:獨立看門狗功能全解析

CW32F030C8T6 看門狗功能概述 CW32F030C8T6 是芯源半導體&#xff08;WCH&#xff09;推出的 Cortex-M0 內核微控制器&#xff0c;內置獨立看門狗&#xff08;IWDG&#xff09;和窗口看門狗&#xff08;WWDG&#xff09;&#xff0c;用于檢測和恢復系統異常狀態。 一.獨立看門…

SAP升級過程中如何確保數據安全?

目錄 升級過程中可能遇到的數據風險 升級前的準備工作 升級過程中的保護措施 升級后的驗證工作 在數字化轉型浪潮中&#xff0c;SAP系統作為企業核心業務運營的系統&#xff0c;其升級過程不僅關乎技術架構的革新&#xff0c;更直接關系到企業最寶貴的資產——數據安全。一…

Vue 3 + Element Plus 常見開發問題與解決方案手冊

&#x1f31f;Vue 3 Element Plus 常見開發問題與解決方案手冊 &#x1f9e0; 本文整理了常見但容易混淆的幾個 Vue 3 前端開發問題&#xff0c;包括插槽、原型鏈、響應式數據處理、v-model 報錯、樣式陰影控制等&#xff0c;建議收藏學習&#xff01; &#x1f4cc;一、動態插…

Spring Boot + 本地部署大模型實現:安全性與可靠性保障

在將大語言模型集成到 Spring Boot 應用中時&#xff0c;安全性和可靠性是兩個關鍵因素。本地部署的大模型雖然提供了強大的功能&#xff0c;但也可能帶來一些安全風險&#xff0c;如數據泄露、模型被惡意利用等。本文將介紹如何在 Spring Boot 應用中保障本地部署大模型的安全…