matlab 混合高斯背景建模的實現

2021-10-03 05:54:04 字數 3377 閱讀 8308

clc;

clear;

%-------混合高斯背景建模 引數 -----------------

gauss_n = 3; %每個畫素點高斯背景模型數量

a = 0.005; %學習速率 alpha

vt = 2.5^2; %方差閾值 2.5*2.5倍的方差varthreshold

bgr = 0.7; %背景比率 backgroundratio

w0 = 0.05; %初始權值 weight

var0= 10^2; %初始方差 variance

f_n = v.numberofframes; %幀數 frame_num

f = rgb2gray(read(v,1)); %讀取第一幀灰度影象

height = v.height; %獲取影象的高度

width = v.width; %獲取影象的寬度

%--------初始化高斯背景模型 共有height*width*gauss_n*3個數值-

%每乙個畫素對應 gauss_n 個高斯背景模型 每個模型有三個引數[權值 均值 方差]

g_b = zeros(height,width,gauss_n,3);

for h = 1:height

for w = 1:width %畫素遍歷

g_b(h,w,1,1) = 1; %第乙個模型初始權值為1

g_b(h,w,1,2) = double(f(h,w));%第乙個模型初始均值為第一幀灰度圖畫素點的值

g_b(h,w,1,3) = 9; %初始方差

endend %此方式初始化容易將第一幀內的運動物體也當成背景 最好使用前n個幀訓練模型 or 一開始的學習率很高

%---------進行匹配 更新模型---------------

%幀遍歷

for n=2:f_n

f = rgb2gray(read(v,n)); %讀取下一幀

%畫素遍歷

for h = 1:height

for w = 1:width

khit = 0; %匹配的模型序號 預設與第乙個模型匹配

bg_n = 0; %描述背景的高斯模型數量

%高斯模型遍歷

for k = 1:gauss_n

ww = g_b(h,w,k,1); %模型權值

if(ww == 0) %權值為0 則模型為空 跳過

continue;

endmean = g_b(h,w,k,2); %模型均值

var = g_b(h,w,k,3); %模型方差

diff = double(f(h,w))-mean; %畫素點與模型均值的差

d2 = diff^2; %差的平方

%與此模型匹配成功

if(d2 < vt*var)

g_b(h,w,k,1) = ww + a * (1 - ww); %增加權值

g_b(h,w,k,2) = mean + a * diff; %更新均值

g_b(h,w,k,3) = var + a * (d2 - var); %更新方差

khit = k; %記錄匹配的模型序號

%模型排序 從後向前冒泡

for kk = k:-1:2

ww1 = g_b(h,w,kk,1);%權值

var1= g_b(h,w,kk,3);%方差

ww = g_b(h,w,kk-1,1);%權值

var = g_b(h,w,kk-1,3);%方差

%大於前乙個 則交換

if(ww1/sqrt(var1) > ww/sqrt(var))

tmp = g_b(h,w,kk,:);

g_b(h,w,kk,:) = g_b(h,w,kk-1,:);

g_b(h,w,kk-1,:) = tmp;

khit = khit - 1; %匹配的模型序號更新

endend

break;

endend

%全部匹配失敗 新建立模型覆蓋權值為0 or 最後乙個模型

if(khit == 0)

for k = 2:gauss_n

if(g_b(h,w,k,1) == 0 || k == gauss_n)

g_b(h,w,k,1) = w0;

g_b(h,w,k,2) = double(f(h,w));

g_b(h,w,k,3) = var0;

break;

endend

khit = k; %匹配的模型序號變更

end%權值歸一化 保證權值和為1

wsum = sum( g_b(h,w,:,1) );

bt = 0;

for k = 1:gauss_n

%%%g_b(h,w,k,1) = g_b(h,w,k,1)/wsum;

bt = bt + g_b(h,w,k,1);

%前bg_n個模型的權值和 大於背景比率 則前gb_n個模型來描述背景

if( bt > bgr && bg_n ==0)

bg_n = k;

endend

%二值化

if(khit > bg_n) %匹配的模型 不是前gb_n描述背景的模型

f(h,w) = 255;

else %匹配的模型 屬於用來描述背景的模型

f(h,w) = 0;

endend

end%輸出

clc;

fprintf('進度:%d / %d \n',n,f_n);

%%-----小結------

%2.畫素點型別為uint8 改為double參與運算才可得負數 (class 檢視變數型別)

%3.列印某幀引數到txt windows \r\n換行

% 1)fid=fopen(strcat(num2str(n),'.txt'),'w'); %建立日誌

% 2)fprintf(fid,'(%d,%d)---%d\r\n',h,w,f(h,w)); %寫入日誌

% 3)fclose(fid); %關閉%

參考博文: opencv之gmm高斯混合模型原始碼解析

混合高斯背景建模(opecv)

混合高斯背景建模是基於畫素樣本統計資訊的背景表示方法,利用畫素在較長時間內大量樣本值的概率密度等統計資訊 如模式數量 每個模式的均值和標準差 表示背景,然後使用統計差分 如3 原則 進行目標畫素判斷,可以對複雜動態背景進行建模,計算量較大。在混合高斯背景模型 高斯分布 來描述每個畫素點的顏色呈現規律...

OpenCV混合高斯背景建模

本文主要內容是乙個混合高斯背景建模 1 的opencv例子。想要了解mog原理可以參考混合高斯背景建模原理及實現 opencv的mog例子 如下 include stdafx.h include include include include include include include incl...

高斯混合背景建模的改進方案

高斯混合背景建模原理 1 stauffer提出自適應混合高斯背景建模,通過融入幀間差分把每幀中的影象區分為背景區域 背景顯露區域和運動物體區域。相對於背景區域,背景顯露區中的畫素點將以大的更新率更新背景模型,使得長時間停滯物體由背景變成運動前景時,被遮擋的背景顯露區被快速恢復。劉鑫,劉輝,強振平,等...