生活随笔
收集整理的這篇文章主要介紹了
高斯混合模型GMM的理解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
高斯混合模型(Gaussian Mixture Model,簡稱GMM)是用高斯概率密度函數(正態分布曲線)精確地量化事物,將一個事物分解為若干的基于高斯概率密度函數(正態分布曲線)形成的模型。通俗點講,無論觀測數據集如何分布以及呈現何種規律,都可以通過多個單一高斯模型的混合進行擬合。
1、對圖像背景建立高斯模型的原理:
圖像灰度直方圖反映的是圖像中某個灰度值出現的頻次,也可以以為是圖像灰度概率密度的估計。如果圖像所包含的目標區域和背景區域相差比較大,且背景區域和目標區域在灰度上有一定的差異,那么該圖像的灰度直方圖呈現雙峰-谷形狀,其中一個峰對應于目標,另一個峰對應于背景的中心灰度。對于復雜的圖像,尤其是醫學圖像,一般是多峰的。通過將直方圖的多峰特性看作是多個高斯分布的疊加,可以解決圖像的分割問題。在智能監控系統中,對于運動目標的檢測是中心內容,而在運動目標檢測提取中,背景目標對于目標的識別和跟蹤至關重要。而建模正是背景目標提取的一個重要環節。
我們首先要提起背景和前景的概念,前景是指在假設背景為靜止的情況下,任何有意義的運動物體即為前景。建模的基本思想是從當前幀中提取前景,其目的是使背景更接近當前視頻幀的背景。即利用當前幀和視頻序列中的當前背景幀進行加權平均來更新背景,但是由于光照突變以及其他外界環境的影響,一般的建模后的背景并非十分干凈清晰,而高斯混合模型(GMM,Gaussian mixture model)是建模最為成功的方法之一,同時GMM可以用在監控視頻索引與檢索。
混合高斯模型使用K(基本為3到5個) 個高斯模型來表征圖像中各個像素點的特征(以第一幀為背景幀),在新一幀圖像獲得后更新混合高斯模型,用當前圖像中的每個像素點與混合高斯模型匹配,如果成功則判定該點為背景點, 否則為前景點。通觀整個高斯模型,他主要是有方差和均值兩個參數決定,對均值和方差的學習,采取不同的學習機制,將直接影響到模型的穩定性、精確性和收斂性。由于我們是對運動目標的背景提取建模,因此需要對高斯模型中方差和均值兩個參數實時更新。為提高模型的學習能力,改進方法對均值和方差的更新采用不同的學習率;為提高在繁忙的場景下,大而慢的運動目標的檢測效果,引入權值均值的概念,建立背景圖像并實時更新,然后結合權值、權值均值和背景圖像對像素點進行前景和背景的分類。
GMM之所以能夠將前景和背景分開是基于如下兩點事實的:
(1)在長期觀測的場景中,背景占大多數時間,更多的數據是支持背景分布的
(2)即使是相對顏色一致的運動物體也會比背景產生更多變化,況且一般情況下物體都是帶有不同顏色的。
2.混合高斯背景建模算法流程
1.每個新像素值Xt同當前K個模型按下式進行比較,直接找到匹配新像素值的分布模型,即同該模型的均值偏差在2.5σ內:
2.如果所匹配的模式符合背景要求,則該像素屬于背景,否則屬于前景。 3.各個模式權值按如下方式進行更新,其中a是學習速率,對于匹配的模式Mk,t=1,否則Mk,t=0,然后各模式的權重進行歸一化:
4.未匹配模式的均值μ和標準差σ不變,匹配模式的參數按照如下更新:
5.如果,第一步中沒有任何模式匹配,則權重最小的模式被替換,即該模式的均值為當前像素值,標準差為初始較大值,權重為較小值。 6.各模式根據w/a^2按降序排列,權重大、標準差小的模式排列在前。 7.選前B個模式作為背景,B滿足下式,參數T表示背景所占的比例: ??????????????????????????????????
參考: http://blog.csdn.net/shenziheng1/article/details/60883147 http://blog.csdn.net/jinshengtao/article/details/26278725
https://baike.baidu.com/item/高斯混合模型/8878468
參考代碼(MATLAB、未驗證)
%Author:?Ziheng?H.?Shen?@Tsinghua?Univ.??%HybridGaussModel?@Digital?Image?Process?Practice??%%?%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%??clc;??clear?all;???cntFrame?=?23;??obj?=?VideoReader('768x576.avi');??numFrames?=?obj.NumberOfFrames;???for?k?=?1?:?cntFrame???????frame?=?read(obj,k);????????imwrite(frame,...????????????strcat('C:\Users\Zi-Heng?Shen\Documents\MATLAB\BackGroundModel\混合高斯背景建模\',...????????????num2str(k),'.bmp'),'bmp');???end??%%?參數定義及初始化??I?=?imread('1.bmp');????????????????????%讀入第一幀作為背景幀??fr_bw?=?I;???????[height,width]?=?size(fr_bw);???????????%求每幀圖像大小??width?=?width/3;????????????????????????%排除顏色通道數??fg?=?zeros(height,?width);??????????????%定義前景和背景矩陣??bg_bw?=?zeros(height,?width);????C?=?3;??????????????????????????????????%?單高斯模型的個數(通常為3-5)??M?=?3;??????????????????????????????????%?代表背景的模型個數??D?=?2.5;????????????????????????????????%?偏差閾值??alpha?=?0.01;???????????????????????????%?學習率??thresh?=?0.25;??????????????????????????%?前景閾值??sd_init?=?15;???????????????????????????%?初始化標準差??w?=?zeros(height,width,C);??????????????%?初始化權重矩陣??mean?=?zeros(height,width,C);???????????%?像素均值??sd?=?zeros(height,width,C);?????????????%?像素標準差??u_diff?=?zeros(height,width,C);?????????%?像素與某個高斯模型均值的絕對距離??p?=?alpha/(1/C);????????????????????????%?初始化p變量,用來更新均值和標準差??rank?=?zeros(1,C);??????????????????????%?各個高斯分布的優先級(w/sd)????pixel_depth?=?8;????????????????????????%?每個像素8bit分辨率??pixel_range?=?2^pixel_depth?-1;?????????%?像素值范圍[0,255]????for?i=1:height??????for?j=1:width??????????for?k=1:C??????????????mean(i,j,k)?=?rand*pixel_range;?????%初始化第k個高斯分布的均值??????????????w(i,j,k)?=?1/C;?????????????????????%?初始化第k個高斯分布的權重??????????????sd(i,j,k)?=?sd_init;????????????????%?初始化第k個高斯分布的標準差?????????????????????end??????end??end????for?n?=?1:cntFrame??????frame=strcat(num2str(n),'.bmp');??????I1?=?imread(frame);??%?依次讀入各幀圖像??????fr_bw?=?I1;?????????????%?計算新像素與第m個高斯模型均值的絕對距離??????for?m=1:C??????????u_diff(:,:,m)?=?abs(double(fr_bw(:,:,m))?-?double(mean(:,:,m)));??????end??????%?更新高斯模型的參數??????for?i=1:height??????????for?j=1:width??????????????match?=?0;???????????????????????????????????????%匹配標記;??????????????for?k=1:C?????????????????????????????????????????if?(abs(u_diff(i,j,k))?<=?D*sd(i,j,k))???????%?像素與第k個高斯模型匹配????????????????????????match?=?1;???????????????????????????????%將匹配標記置為1??????????????????????%?更新權重、均值、標準差、p??????????????????????w(i,j,k)?=?(1-alpha)*w(i,j,k)?+?alpha;??????????????????????p?=?alpha/w(i,j,k);????????????????????????????????????????mean(i,j,k)?=?(1-p)*mean(i,j,k)?+?p*double(fr_bw(i,j));??????????????????????sd(i,j,k)?=???sqrt((1-p)*(sd(i,j,k)^2)?+?p*((double(fr_bw(i,j))?-?mean(i,j,k)))^2);??????????????????else?????????????????????????????????????????%?像素與第k個高斯模型不匹配??????????????????????w(i,j,k)?=?(1-alpha)*w(i,j,k);???????????%略微減少權重?????????????????????end??????????????end????????????????????bg_bw(i,j)=0;??????????????for?k=1:C??????????????????bg_bw(i,j)?=?bg_bw(i,j)+?mean(i,j,k)*w(i,j,k);??????????????end??????????????%?像素值與任一高斯模型都不匹配,則創建新的模型??????????????if?(match?==?0)??????????????????[min_w,?min_w_index]?=?min(w(i,j,:));??????%尋找最小權重??????????????????mean(i,j,min_w_index)?=?double(fr_bw(i,j));%初始化均值為當前觀測像素的均值??????????????????sd(i,j,min_w_index)?=?sd_init;?????????????%初始化標準差為6??????????????end??????????????rank?=?w(i,j,:)./sd(i,j,:);????????????????????%?計算模型優先級??????????????rank_ind?=?[1:1:C];%優先級索引?????????????????????%?計算前景????????????????????fg(i,j)?=?0;??????????????while?((match?==?0)&&(k<=M))???????????????????????????????if?(abs(u_diff(i,j,rank_ind(k)))?<=?D*sd(i,j,rank_ind(k)))%?像素與第k個高斯模型匹配??????????????????????????fg(i,j)?=?0;?%該像素為背景,置為黑色??????????????????????????????else??????????????????????????fg(i,j)?=?255;????%否則為前景,置為白色???????????????????????end??????????????????????????????????????????k?=?k+1;??????????????end??????????end??????end??????figure(n)??????subplot(1,3,1),imshow(fr_bw);???????????????%顯示最后一幀圖像??????subplot(1,3,2),imshow(uint8(bg_bw))?????????%顯示背景??????disk?=?strel('disk',1);disk1?=?strel('disk',4);??????subplot(1,3,3),imshow(imdilate(imerode(uint8(fg),disk),disk1));???%顯示前景??end</span>?
總結
以上是生活随笔為你收集整理的高斯混合模型GMM的理解的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。