运动目标检测_单高斯背景建模
生活随笔
收集整理的這篇文章主要介紹了
运动目标检测_单高斯背景建模
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.運動目標背景建模
背景建模也稱為背景估計,其主要目的是根據當前的背景估計,把對序列圖像的運動目標檢測問題轉化為一個二分類問題,將所有像素劃分為背景和運動前景兩類,進而對分類結果進行后處理,得到最終檢測結果。比較簡單的獲取背景圖像的方法是當場景中無任何運動目標出現時捕獲背景圖像,但這種方法不能實現自適應,通常僅適應于對場景的短時間監控,不能滿足智能監控系統對背景建模的要求。背景減除法的關鍵是背景模型,它是背景減除法分割運動前景的基礎。背景模型主要有單模態和多模態兩種,前者在每個背景像素上的顏色分布比較集中,可以用單分布概率模型來描述,后者的分布則比較分散,需要多分布概率模型來共同描述。在許多應用場景,如水面的波紋、搖擺的樹枝、飄揚的旗幟、監視器屏幕等,像素值都呈現出多模態特性。最常用的描述場景背景像素顏色分布的概率密度函數是高斯分布。
2.單高斯背景建模
高斯背景模型是一種運動目標檢測過程中提取并更新背景和前景的一種方法。單分布高斯背景模型認為,對一個背景圖像,特定像素亮度的分布滿足高斯分布,即對背景圖像B,每一個點(x,y)的亮度滿足B(x,y)~N(u,d):
即每一個點(x,y)都包含了兩個屬性,均值u和方差d:
計算一段時間內的視頻序列圖像中每一個點的均值u和方差d,作為背景模型。對于一幅包含前景的任意圖像G,對于圖像上的每一個點(x,y)計算,若:
(T為一個常數閾值),則認為該點是背景點,否則為前景點。接下來就背景的更新,每一幀圖像都參與背景的更新: ?
其中,p為一個常數,用來反映背景更新率,p越大,背景更新的越慢。一般情況下,背景更新后d的變化很小,所以在更新背景以后一般不再更新d。
3.MATLAB仿真及輸出結果
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Author:Ziheng H. Shen @Tsinghua Univ. %Date:20170308 @Digital Image Process Practice %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clear all %% 讀入視頻,并記錄幀率 fileName = '768x576.avi'; Video = VideoReader(fileName); numFrames = Video.NumberOfFrames; frame = read(Video,1); %% 用第一幀圖像數據初始化背景模型 alpha = 0.03; %背景建模alpha值 stdInit = 20; %初始化標準差 varInit = stdInit * stdInit ; %初始化方差 lamda = 2.5*1.2 ; %背景更新參數 [h,w] = size(frame);%提取第一幀圖像的高度和寬度 w = w/3; %彩色圖像RGB,所以需要除以3 for i=1:h for j=1:w pixel_R = frame(i,j,1); pixel_G = frame(i,j,2); pixel_B = frame(i,j,3); %期望圖像為原圖,背景pixel_uR = pixel_R; pixel_ug = pixel_G; pixel_ub = pixel_B; %前景圖像初始化為0 pixel_dr = 0; pixel_dg = 0; pixel_db = 0; %標準差 pixel_stdr = stdInit; pixel_stdg = stdInit; pixel_stdb = stdInit; %方差pixel_varr = varInit; pixel_varg = varInit; pixel_varb = varInit; frame_u(i,j,1:3) = [pixel_uR pixel_ug pixel_ub]; frame_d(i,j,1:3) = [pixel_dr pixel_dg pixel_db]; fram_std(i,j,1:3) = [pixel_stdr pixel_stdg pixel_stdb]; frame_var(i,j,1:3) = [pixel_varr pixel_varg pixel_varb]; end end %% 單高斯背景更新 for k = 1 : 5%numFrames % 讀取幀數據 frame = read(Video,k); for i=1:h for j=1:w pixel_R = frame(i,j,1); pixel_G = frame(i,j,2); pixel_B = frame(i,j,3); %期望圖像(背景),初始化為第一幀圖 pixel_uR = frame_u(i,j,1); pixel_ug = frame_u(i,j,2); pixel_ub = frame_u(i,j,3); %前景圖像,初始為0 pixel_dr = frame_d(i,j,1); pixel_dg = frame_d(i,j,2); pixel_db = frame_d(i,j,3); %標準差 pixel_stdr = fram_std(i,j,1); pixel_stdg = fram_std(i,j,2); pixel_stdb = fram_std(i,j,3); %方差 pixel_varr = frame_var(i,j,1); pixel_varg = frame_var(i,j,2); pixel_varb = frame_var(i,j,3); %|I-u|<lamda*std時認為是背景,進行背景更新 if( (abs(pixel_R-pixel_uR)<lamda*pixel_stdr) &&...(abs(pixel_G-pixel_ug)<lamda*pixel_stdg) &&...(abs(pixel_B-pixel_ub)<lamda*pixel_stdb) ) %更新期望,u=(1-alpha)*u+alpha*1 pixel_uR = (1-alpha)* pixel_uR + alpha * pixel_R; pixel_ug = (1-alpha)* pixel_ug + alpha * pixel_G; pixel_ub = (1-alpha)* pixel_ub + alpha * pixel_B; %更新方差var=(1-alpha)*var+alpha*(I-u)^2 pixel_varr = (1-alpha)*pixel_varr + alpha*(pixel_R-pixel_uR)^2; pixel_varg = (1-alpha)*pixel_varg + alpha*(pixel_G-pixel_ug)^2; pixel_varb = (1-alpha)*pixel_varb + alpha*(pixel_B-pixel_ub)^2; %更新標準差 pixel_stdr = sqrt(double(pixel_varr)); pixel_stdg = sqrt(double(pixel_varg)); pixel_stdb = sqrt(double(pixel_varb)); %圖像內容更新 frame_u(i,j,1:3) = [pixel_uR pixel_ug pixel_ub]; fram_std(i,j,1:3) = [pixel_stdr pixel_stdg pixel_stdb]; frame_var(i,j,1:3) = [pixel_varr pixel_varg pixel_varb]; else pixel_dr = pixel_R - pixel_uR; pixel_dg = pixel_G - pixel_ug; pixel_db = pixel_B - pixel_ub; frame_d(i,j,1:3) = [pixel_dr pixel_dg pixel_db]; end end end figure(2*k-2) %查看每一幀循環下來的結果 imshow(frame_u); %背景figure(3*k-1)imshow(frame_d); %前景figure(3*k) %先腐蝕后膨脹disk = strel('disk',1); frame_d = imdilate(imerode(frame_d,disk),disk),disk;imshow(frame_d); %前景end 輸出結果(背景->前景->目標檢測)?? 需要說明的是,單高斯模型受初始化參數和第一幀圖像影響很大。
總結
以上是生活随笔為你收集整理的运动目标检测_单高斯背景建模的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络管理员如何解放自己
- 下一篇: 浅谈飞鸽传书实现原理