計算機視覺——光流法

系列文章目錄

本系列開篇文章,暫時沒有目錄啦~

文章目錄


前言

光流(Optical Flow)是指圖像中的物體在連續幀之間的相對運動。具體來說,光流法試圖通過圖像中的像素變化(通常是亮度變化)來推測場景中物體的運動方向和速度。
假設你有一個視頻或連續的圖像幀,光流法就是計算在連續的兩幀圖像之間,每個像素點的位移(即物體的運動)。如果你可以估計每個像素點的位移,那么你就可以獲得整個圖像的光流場。

主要參考了下述兩篇文章,如有侵權,聯系我我會刪除此內容
經典光流算法Lucas-Kanade(有圖助理解)
光流法(optical flow methods)

一、問題假設

假設一——亮度一致性假設:圖像中某個像素點的亮度在連續的兩幀圖像之間不會發生太大變化,只有由于相對運動而產生的位移。即假設物體的亮度在兩幀圖像之間是恒定的。這個假設是基于圖像的亮度變化主要由物體的運動引起的。
假設二——平滑性假設:圖像中的運動變化是平滑的,即在局部區域內,相鄰像素的運動是相似的。

二、方程推導

設t時刻(x,y)位置的像素亮度為I(x,y,t)I(x,y,t)I(x,y,t)
根據假設一,對于一個像素點(x,y)(x,y)(x,y),在時間tttt+Δtt+\Delta tt+Δt之間的亮度變化應滿足:
I(x,y,t)=I(x+Δx,y+Δy,t+Δt)I(x,y,t)=I(x+\Delta x,y+\Delta y,t+\Delta t)I(x,y,t)=I(x+Δx,y+Δy,t+Δt)
其中:

  • I(x,y,t)I(x,y,t)I(x,y,t)表示時刻ttt時,坐標(x,y)(x,y)(x,y)位置的亮度。
  • Δx,Δy\Delta x,\Delta yΔx,Δy分別是該像素在水平和垂直方向上的位移。
  • Δt\Delta tΔt是兩個圖像幀之間的時間差。

利用泰勒級數展開對右邊進行近似,可以得到一個簡化的表達式。泰勒展開的思想是,通過將一個函數在某一點附近的變化表示為該點函數值與其各階導數的線性組合,來逼近這個函數在該點附近的值。
I(x+Δx,y+Δy,t+Δt)I(x+\Delta x,y+\Delta y,t+\Delta t)I(x+Δx,y+Δy,t+Δt)近似為I(x+Δx,y+Δy,t+Δt)≈I(x,y,t)+?I?xΔx+?I?yΔy+?I?tΔtI(x+\Delta x,y+\Delta y,t+\Delta t) \approx I(x,y,t)+\frac{\partial I}{\partial x}\Delta x+\frac{\partial I}{\partial y}\Delta y+\frac{\partial I}{\partial t}\Delta tI(x+Δx,y+Δy,t+Δt)I(x,y,t)+?x?I?Δx+?y?I?Δy+?t?I?Δt
這個公式使用了泰勒展開的前幾項,其中:

  • ?I?x\frac{\partial I}{\partial x}?x?I?是圖像I(x,y,t)I(x,y,t)I(x,y,t)xxx方向的偏導數,表示圖像亮度在水平(x)方向上的變化速率(即圖像在xxx方向上的梯度);
  • ?I?y\frac{\partial I}{\partial y}?y?I?是圖像I(x,y,t))I(x,y,t))I(x,y,t))yyy方向的偏導數,表示圖像亮度在垂直(y)方向上的變化速率(即圖像在yyy方向上的梯度);
  • ?I?t\frac{\partial I}{\partial t}?t?I?是圖像I(x,y,t)I(x,y,t)I(x,y,t)隨時間ttt變化的偏導數,表示圖像亮度在時間方向上的變化速率(即圖像隨時間變化的亮度變化)。

現在,我們將泰勒展開的結果代入亮度恒定假設中:
I(x,y,t)=I(x+Δx,y+Δy,t+Δt)=I(x,y,t)+IxΔx+IyΔy+ItΔtI(x,y,t)=I(x+\Delta x,y+\Delta y,t+\Delta t)=I(x,y,t)+I_x\Delta x+I_y\Delta y+I_t\Delta tI(x,y,t)=I(x+Δx,y+Δy,t+Δt)=I(x,y,t)+Ix?Δx+Iy?Δy+It?Δt
其中:

  • Ix=?I?xI_x=\frac{\partial I}{\partial x}Ix?=?x?I?是圖像在xxx方向的梯度;
  • Iy=?I?yI_y=\frac{\partial I}{\partial y}Iy?=?y?I?是圖像在yyy方向的梯度;
  • It=?I?tI_t=\frac{\partial I}{\partial t}It?=?t?I?是圖像在ttt方向的梯度。

由于左側的兩個I(x,y,t)I(x,y,t)I(x,y,t)相等,可以將它們抵消掉:
0=IxΔx+IyΔy+ItΔt0=I_x\Delta x+I_y\Delta y+I_t\Delta t0=Ix?Δx+Iy?Δy+It?Δt
接下來,假設Δx\Delta xΔxΔy\Delta yΔy是該像素的位移(即物體運動導致該像素位置的變化),我們可以將Δx\Delta xΔxΔy\Delta yΔy表示為光流的分量uuuvvv,即:
Δx=uΔt\Delta x=u\Delta tΔx=uΔt
Δy=vΔt\Delta y=v\Delta tΔy=vΔt
其中:

  • uuu是圖像中像素在方向的運動速度(光流的水平分量);
  • vvv是圖像中像素在方向的運動速度(光流的垂直分量);
  • Δt\Delta tΔt是兩個時間幀之間的時間差。

將這些表達式代入之前的方程,我們得到:
0=IxuΔt+IyvΔt+ItΔt0=I_xu\Delta t+I_yv\Delta t+I_t\Delta t0=Ix?uΔt+Iy?vΔt+It?Δt
由于Δt\Delta tΔt是一個常數,且不等于零,我們可以把Δt\Delta tΔt消去,得到光流的核心方程:
Ixu+Iyv+It=0I_xu+I_yv+I_t=0Ix?u+Iy?v+It?=0
這個方程描述了在每個像素點上,圖像亮度變化與該點的運動(光流)之間的關系。它給出了光流uuuvvv的關系:像素的運動(光流)與圖像的梯度信息(在空間和時間上的變化)有關。

三、計算Ix,Iy,ItI_x,I_y,I_tIx?,Iy?,It?

四、計算光流u,vu,vu,v

4.1 傳統算法Lucas-Kanade算法

增加一個假設:假設在小窗口內,光流是恒定的。
算法的核心思想是通過在該窗口內對每個像素的光流方程進行加權最小二乘法擬合,從而估算出該窗口內所有像素的水平和垂直方向的光流(即uuuvvv)。
Ixu+Iyv+It=0I_xu+I_yv+I_t=0Ix?u+Iy?v+It?=0
我們將上述公式轉為矩陣形式:
(Ix,Iy)(uv)=?It(I_x,I_y)\begin{pmatrix} u\\ v \end{pmatrix}=-I_t(Ix?,Iy?)(uv?)=?It?
所以,如果我們選擇一個n×nn \times nn×n的窗口(包含n2n^2n2個像素),那么每個像素的光流滿足相同的方程。對于這個窗口內的所有像素,我們可以構建以下方程組:
{Ix1u+Iy1v=?It1Ix2u+Iy2v=?It2?Ixnu+Iynv=?Itn\left\{\begin{matrix} I_{x1}u+I_{y1}v=-I_{t1}\\ I_{x2}u+I_{y2}v=-I_{t2}\\ \vdots \\ I_{xn}u+I_{yn}v=-I_{tn} \end{matrix}\right.????Ix1?u+Iy1?v=?It1?Ix2?u+Iy2?v=?It2??Ixn?u+Iyn?v=?Itn??
將上述方程組轉為矩陣形式:
[Ix1Iy1Ix2Iy2??IxnIyn][uv]=?[It1It2?Itn]\begin{bmatrix} I_{x1} & I_{y1}\\ I_{x2} & I_{y2}\\ \vdots &\vdots \\ I_{xn} &I_{yn} \end{bmatrix}\begin{bmatrix} u\\ v \end{bmatrix}=-\begin{bmatrix} I_{t1}\\ I_{t2}\\ \vdots\\ I_{tn} \end{bmatrix}?Ix1?Ix2??Ixn??Iy1?Iy2??Iyn???[uv?]=??It1?It2??Itn???
令左邊矩陣為AAA,中間矩陣為xxx,右邊矩陣為bbb,上述公式轉為:
Ax=bAx=bAx=b
利用最小二乘法的解法,我們可以得到uuuvvv的解:
x=(ATA)?1ATbx=(A^TA)^{-1}A^{T}bx=(ATA)?1ATb
觀察上述公式可以發現一個問題:ATAA^TAATA一定有逆嗎?參看第五節。

五、孔徑問題

5.1 直觀理解

想象你透過一個小孔(比如一根吸管)去觀察一條運動的直線。如果這條直線向右上方移動,你在小孔里看到的只是直線的一小段。由于你只能看到局部信息,你會發現:

  • 直線沿著垂直于自身的方向移動時,亮度會明顯變化;
  • 但如果直線沿著平行于自身的方向移動時,局部的亮度看起來幾乎不變。

結果就是:
你無法僅憑小孔里的這一小段直線判斷運動的真實方向,只能感知到垂直于邊緣的運動,而沿邊緣方向的運動信息丟失。
這就是“孔徑問題”的由來。

5.2 數學角度

光流基本方程是:
Ixu+Iyv+It=0I_xu+I_yv+I_t=0Ix?u+Iy?v+It?=0
這是一個一元約束(一條方程),但我們有兩個未知數(u,v)(u,v)(u,v)
結果是:我們只能確定光流在圖像梯度方向上的分量,而沿著等梯度方向的分量無法確定。
舉個例子:

  • 如果圖像中某個區域是純水平邊緣(亮度只隨 y 變化),則Ix=0,Iy≠0I_x=0,I_y \neq 0Ix?=0,Iy?=0
  • 則方程變成Iyv+It=0I_yv+I_t=0Iy?v+It?=0。這時候我們只能解出vvv(垂直方向的運動),而uuu(水平方向的運動)完全不受約束。
  • 這就是孔徑問題:缺少運動方向的完整信息。

那么與ATAA^TAATA是否可逆有什么關系呢?
我們先考慮一下有哪些情況ATAA^TAATA不可逆:

  1. 像素的梯度信息缺失或重復:如果圖像中的某個區域(或多個區域)的梯度信息是重復的或無效的,那么矩陣的列會變得線性相關。例如,如果在某個區域內圖像亮度完全不變化(如純白色區域),那么,這意味著我們無法從該像素中提取任何有用的運動信息,導致梯度矩陣的列是線性相關的。
  2. 沒有足夠的運動信息:在一些特定情況下,比如圖像中存在單一的邊緣(比如水平或垂直邊緣),我們只能檢測到沿邊緣方向的運動,而無法感知到垂直于邊緣方向的運動。這會導致方向的梯度相同或相互平行,進而使得矩陣變得奇異(不可逆)。
  3. 局部區域的梯度信息不足:如果選擇的局部窗口區域太小,導致該區域內的圖像梯度幾乎沒有變化,也可能導致的列線性相關。例如,如果選擇一個只有一條直線的區域,那么該區域內的梯度信息就沒有足夠的多樣性來推測所有方向的運動。

是不是有點眼熟,好像我們剛剛在直觀理解里面提到過一些東西?沒錯,孔徑問題是在一定程度上可以用ATAA^TAATA不可逆來解釋的。那么ATAA^TAATA不可逆會出現什么情況呢?可能會出現多解,也就是不能準確估計運動方向。

5.3 解決方法

既然ATAA^TAATA不可逆會出現孔徑問題,那么我們不用ATAA^TAATA不可逆的地方不就行了?
因此我們可以選擇一些角點,這樣保證ATAA^TAATA可逆,就可以保證光流估計運動方向的精度了。

總結

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

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

相關文章

前端安全攻防:XSS, CSRF 等防范與檢測

前端安全攻防:XSS, CSRF 等防范與檢測在Web應用日益普及的今天,前端安全已經成為一個不容忽視的重要環節。隨著攻擊技術的不斷演進,各種前端安全漏洞(如跨站腳本攻擊 XSS、跨站請求偽造 CSRF 等)層出不窮,它…

03OpenCV圖像處理

參考課程: 【黑馬程序員 OpenCV入門教程】 [https://www.bilibili.com/video/BV1Fo4y1d7JL] ZZHow(ZZHow1024) 1.1幾何變換 圖像縮放 對圖像的大小進行調整,即使圖像放大或縮小 cv2.resize(src, dsize, fx0, fy0, interpolationcv2.INTER_LINEAR)參數…

UE5 C++ 第三方動態庫的使用

一. 首先要拷貝對應的 第三方庫 bin里有dll動態庫,include里有動態庫需要的頭文件。 二.在Target.cs里,進行設置 頭文件前面的路徑為公共路徑 設置需要一起打包的三方庫文件 三.加載這個庫 FPlatformProcess::GetDllHandle將他解析為 任意類型&#x…

C++進階——多態

? ? ? ? ? づ?ど 🎉 歡迎點贊支持🎉 個人主頁:勵志不掉頭發的內向程序員; 專欄主頁:C語言; 文章目錄 前言 一、多態的概念 二、多態的定義及實現 2.1、多態的構成條件 (1)虛函…

Swift 語法學習指南 - 與 Kotlin 對比

Swift 語法學習指南 - 與 Kotlin 對比 本指南專為有 Android/Kotlin 開發經驗的開發者設計,通過對比學習快速掌握 Swift 語法 目錄 語言基礎對比變量與常量數據類型函數定義類與結構體繼承與協議可選類型集合類型控制流閉包與Lambda擴展與Extension錯誤處理內存管理…

嵌入式C語言筆記十七——構造數據類型

一.結構體:1.類型定義:struct 結構體名 {數據類型1 成員變量1;數據類型2 成員變量2;數據類型3 成員變量3;... };struct student {char name[32];char sex;int age;int score; };2.結構體變量定義:存儲類型 數據類型 變量名;3.結構體元素初始化…

深入實踐G1垃圾收集器調優:Java應用性能優化實戰指南

深入實踐G1垃圾收集器調優:Java應用性能優化實戰指南 一、技術背景與應用場景 隨著微服務和海量并發請求的普及,Java應用在生產環境中對低延遲和高吞吐的需求日益顯著。傳統的CMS和Parallel GC 在大內存場景下常出現Full GC 停頓時間長、吞吐下降等問題…

【JobScheduler】Android 后臺任務調度的核心組件指南

JobScheduler 是 Android 平臺上原生支持在直接啟動模式(Direct Boot Mode)下執行任務的調度器。 相比 WorkManager 需要復雜的配置才能勉強支持直接啟動,JobScheduler 在這方面有著天生的優勢和明確的 API 支持。如果你面臨的硬性要求是必須…

c# 調用basler 相機

目錄 一聯合halcon: 二 c# 原生 一聯合halcon: 環境配置 下載安裝pylon軟件 下載安裝halcon 創建 winform項目 test_basler 添加引用 打開pylon可以連接相機 可以看到我的相機id為23970642 ( c#聯合halcon的基礎教程(案例…

《2025年AI產業發展十大趨勢報告》四十六

《2025年AI產業發展十大趨勢報告》四十六隨著科技的迅猛發展,人工智能(AI)作為引領新一輪科技革命和產業變革的戰略性技術,正逐步滲透到各個行業和領域,成為推動經濟社會發展的重要引擎。2023年,生成式AI的…

c++ 雜記

1. 為什么返回*this?2. 3. 友元函數的使用&#xff1a;需要頭文件中類內外聲明&#xff0c;cpp文件中實現定義哦// Sales_data.h #ifndef SALES_DATA_H #define SALES_DATA_H#include <string>class Sales_data {std::string bookNo;int units_sold 0;double revenue …

PDF文件基礎-計算機字體

計算機字體的原理包含了字符編碼、字形渲染和字體文件存儲三個關鍵技術。 字符編碼負責將每個字符映射到一個唯一的數字碼&#xff1b;字形渲染則將這些數字碼轉換成屏幕或紙張上可識別的圖形&#xff1b;字體文件存儲則包含了字符的編碼、圖形描述信息以及字體的其他屬性&…

華為IP(9)

OSPF的基本配置OSPF路由計算前言&#xff1a;1)同一區域內的OSPF路由器擁有完全一致的LSDB&#xff0c;在區域內部&#xff0c;OSPF采用SPF算法完成路由計算。2&#xff09;隨著網絡規模不斷擴大&#xff0c;路由器為了完成路由計算所消耗的內存、CPU資源也越來越多。通過區域劃…

java.nio.file.InvalidPathException異常

一.問題概述 本人在ubuntu22.04的操作系統上&#xff0c;運行java程序時創建一個文件時&#xff0c;由于文件名稱中包含了中文&#xff0c;所以導致了程序拋出了java.nio.file.InvalidPathException的異常。 java.nio.file.InvalidPathException: Malformed input or input co…

Next系統總結學習(一)

下面我按題號逐條 詳細 解釋并給出示例與最佳實踐。為便于閱讀&#xff0c;我會同時給出關鍵代碼片段&#xff08;偽代碼/實用例子&#xff09;&#xff0c;并指出常見坑與解決方案。 1. 你是如何理解服務端渲染&#xff08;SSR&#xff09;的&#xff1f;它的核心工作流程是怎…

房屋安全鑒定需要什么條件

房屋安全鑒定需要什么條件&#xff1a;專業流程與必備要素解析房屋安全鑒定是保障建筑使用安全的重要環節&#xff0c;它通過對建筑結構、材料性能及使用狀況的全面評估&#xff0c;為房屋的安全使用、改造或維護提供科學依據。隨著城市建筑老化及自然災害頻發&#xff0c;房屋…

現代C++:現代C++?

C語言正在走向完美&#xff0c;所以&#xff0c;C語言值得學習&#xff08;甚至研究&#xff09;&#xff0c;這些知識可以成為一切編程的基礎。然而在實踐中&#xff0c;不必全面的使用C語言的各種特性&#xff0c;而應根據工程項目的實際情況&#xff0c;適當取舍&#xff08…

【C++】哈希表實現

1. 哈希概念 哈希(hash)又稱散列&#xff0c;是?種組織數據的方式。從譯名來看&#xff0c;有散亂排列的意思。本質就是通過哈希 函數把關鍵字Key跟存儲位置建立一個映射關系&#xff0c;查找時通過這個哈希函數計算出Key存儲的位置&#xff0c;進行快速查找 1.1 直接定址法…

ai 玩游戲 llm玩街霸 大模型玩街霸 (3)

1. 開源代碼地址&#xff1a; https://github.com/OpenGenerativeAI/llm-colosseum 2. 架構&#xff1a; 3. 圖片&#xff1a; 4. 感覺還是下面的步驟&#xff1a; a. 實時理解游戲當前環境&#xff0c;英雄角色&#xff0c;英雄狀態 b. 根據當前狀態感知&#xff0c;生成英雄…

2025年滲透測試面試題總結-59(題目+回答)

安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 一、SQL注入全解 二、XSS與文件漏洞 三、服務端漏洞專題 四、職業經驗與能力評估 1、注入攻擊原理是什么…