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