混合高斯背景建模matlab代码
混合高斯背景模型

//去凸角
cvDilate(pFrImg, pFrImg, 0, 2); //闭
cvErode(pFrImg, pFrImg, 0, 2);
cvErode(pFrImg, pFrImg, 0, 2); //开
{
IplImage* pFrame = NULL;
IplImage* pFrImg = NULL;
IplImage* pBkImg = NULL;
CvCapture* pCapture = NULL;
int nFrmNum = 0;
if( 2 == mode) //选黑色背景
{
for(i = 2; i < pFrImg->height-2; i++) // 行操作
{
k = 0;
for(j = 2; j < pFrImg->widthStep-2; j++) // 列操作(从左到右)
}
else
{
//更新高斯模型
cvUpdateBGStatModel(pFrame, (CvBGStatModel *)bg_model );
//pFrImg为前景图像,只能为单通道
//pBkImg为背景图像,可以为单通道或与pFrame通道数相同
cvDilate(pFrImg, pFrImg, 0, 2);
//去凹槽
cvErode(pFrImg, pFrImg, 0, 2); //开
cvDilate(pFrImg, pFrImg, 0, 2);
cvDilate(pFrImg, pFrImg, 0, 2); //闭
高斯gmm模型 聚类matlab

在本文中,我将深入探讨高斯混合模型(Gaussian Mixture Model,GMM)以及其在聚类中的应用,特别是在Matlab环境下的实现。
让我们先来了解一下GMM的基本概念。
1. 高斯混合模型(GMM)简介高斯混合模型是一种概率模型,它假设数据是由多个高斯分布组成的。
这意味着它可以表示多个独立的分量,并且每个分量都符合高斯分布。
GMM可以用来对复杂的数据进行建模,尤其适用于聚类和密度估计。
2. GMM在聚类中的应用在聚类分析中,GMM可以帮助我们将数据分成不同的组,每个组代表一个潜在的类别。
通过估计数据点属于每个组的概率,我们可以更准确地将数据进行分类。
而且,由于GMM允许分布呈现出椭圆形状,因此相较于K均值聚类,GMM对于复杂的、非线性分布的数据具有更好的表现。
3. Matlab环境下的GMM实现在Matlab环境下,我们可以利用Statistics and Machine Learning Toolbox中的gmdistribution类来实现GMM。
通过该类,我们可以进行模型拟合、聚类、密度估计等工作。
Matlab还提供了丰富的可视化工具,可以帮助我们更直观地理解和分析聚类效果。
接下来,让我们来讨论一下我对这个主题的个人观点和理解。
我认为GMM作为一种强大的聚类和模型拟合工具,在实际应用中具有很大的潜力。
其对复杂数据的拟合能力和对多种分布的灵活性使其在实际问题中表现出色。
特别是在图像分割、自然语言处理和生物信息学等领域,GMM都得到了广泛的应用和验证。
总结回顾一下,本文深入探讨了高斯混合模型以及其在聚类中的应用。
我们从GMM的基本概念入手,详细介绍了其在聚类分析中的作用,以及在Matlab环境下的实现。
我也共享了个人对这个主题的观点和理解。
希望通过本文的阐述,你能对GMM有一个更全面、深刻和灵活的理解。
以上就是本文的全部内容,希望对你有所帮助。
如果有任何问题或需要进一步的讨论,欢迎随时联系我。
高斯模板的实现matlab版

(一)目标生成一个(2n+1)×(2n+1)大小的高斯模板h(标准为sigma),然后用此模板对图像进行滤波。
具体要求注:这里采用了多种方法:方法一:自己编写高斯模板,并用imfilter等函数。
方法二:自己编写高斯模板,不能用imfilter等函数。
方法三:利用matlab中的 fspecial 来产生高斯模板。
(二)前言为什么要讨论上述方法呢?通过编程显示便可知道方法的不同产生的高斯函数会略有不同。
编程前,我们首先应该了解一下高斯函数及高斯滤波。
(三)相关知识1.高斯函数的定义根据一维高斯函数,可以推导得到二维高斯函数:参考博文:高斯函数以及在图像处理中的应用总结2.高斯滤波原理高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。
高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。
3.高斯模板公式二维高斯模板可以通过矩阵m来实现,假设模板的大小为(2k+1, 2k+1), 其中k为模板中心,则m(i,j)的值如下所示:4.模板与图像滤波的实现(实质:卷积)其中,w表示高斯算子,a,b表示算子大小。
(四)不同方法实现高斯模板的区别这里先放结果,代码部分见方法一由于不同标准差会造成不同效果,编程代码见附录2,这里显示我以0.5:0.5:4.5的sigma来设计不同的15*15高斯低通模板显示不同高斯模板之间的区别,如下所示:下面为我根据高斯函数表达书编写的高斯模板三维显示图:matlab中自带高斯模板函数,显示如下:由上述可知,sigma越小,函数越窄越高,与前述的理论不同。
高斯模板与自己编写的区别主要是在模板中心值的不同,中心像素值的不同会导致周围的值也有所不同,运行方法一中代码你就知道了,这里我就不放了。
(五)实现过程与结果1.方法1实验结果如下所示:自己编写的滤波效果:matlab自带对比如下:(左边自己,后边matlab)实验代码:n_size =15;center_n =(n_size +1)/2;n_row = n_size;n_col = n_size;array_sigma =0.5:0.5:4.5;map_x =1:n_row; map_y =1:n_col;figure('name','不同高斯模板三维图')for k =1:9sigma =array_sigma(k);fori=1: n_rowforj=1: n_coldistance_s =double((i-center_n-1)^2+(j-center_n-1)^2);g_ry(i,j)=exp((-1)* distance_s/(2*sigma^2))/(2*pi*(sigma^2));endenddisp(num2str(sigma));disp(g_ry)subplot(3,3,k);surf(map_x,map_y,g_ry);title(num2str(sigma));endfigure('name','matlab不同高斯模板三维图')for k =1:9sigma =array_sigma(k);gausfilter =fspecial('gaussian',[n_row n_col],sigma);disp(num2str(sigma));disp(gausfilter)subplot(3,3,k);surf(map_x,map_y,g_ry);tit le(num2str(sigma));endfigure('name','不同高斯模板滤波效果(my)')srcimg =imread('pic_3_x2.jpg');subplot(3,4,1);imshow(uint8(srcimg));title('原图');grayimg =rgb2gray(srcimg);subplot(3,4,5);imshow(uint8(grayimg));title('灰度图');image_noise =imnoise(grayimg,'gaussian');subplot(3,4,9);imshow(uint8(image_noise));title('加噪图');for k =1:9sigma =array_sigma(k);fori=1: n_rowforj=1: n_coldistance_s =double((i-center_n-1)^2+(j-center_n-1)^2);g_ry(i,j)=exp((-1)* distance_s/(2*sigma^2))/(2*pi*(sigma^2));endendsubplot(3,4,k+ceil(k/3));gry_img=imfilter(image_noise,g_ry);imshow(gry_img);title(num2str(sigma));endfigure('name','不同高斯模板滤波效果(matlab)')subplot(3,4,1);imshow(uint8(srcimg));title('原图');subplot(3,4,5);imshow(uint8(grayimg));title('灰度图');subplot(3,4,9);imshow(uint8(image_noise));title('加噪图');for k =1:9sigma =array_sigma(k);gausfilter =fspecial('gaussian',[n_row n_col],sigma);subplot(3,4,k+ceil(k/3));gry_img =imfilter(image_noise,gausfilter);imshow(gry_img);title(num2str(sigma));end2.方法2实验结果如下:实验代码:srcimg=imread('pic_3_x2.jpg');grayimg=rgb2gray(uint8(srcimg));k =size(grayimg);[grayimg_row,grayimg_col]=size(grayimg);sigma =1.6;n =7;n_row =2*n+1;n_col =2*n+1;image_noise =imnoise(grayimg,'gaussian');g_ry =[];fori=1:n_rowforj=1:n_coldistance_s=double((i-n-1)^2+(j-n-1)^2);g_ry(i,j)=exp(-distance_s/(2*sigma*sigma))/(2*pi*sigma*sigma);endendg_ry=g_ry/sum(g_ry(:));dstimg_gry =zeros(grayimg_row,grayimg_col);fori=1:grayimg_rowforj=1:grayimg_coldstimg_gry(i,j)=image_noise(i,j);endendtemp=[];for ai=n+1:grayimg_row-n-1for aj=n+1:grayimg_col-n-1temp=0;for bi=1:n_rowfor bj=1:n_coltemp= temp+(dstimg_gry(ai+bi-n-1,aj+bj-n-1)*g_ry(bi,bj));endenddstimg_gry(ai,aj)=temp;endenddstimg_gry=uint8(dstimg_gry);gausfilter =fspecial('gaussian',[n_row n_col],sigma);gmf_img=imfilter(image_noise,gausfilter,'conv');figure('name','不处理边界的高斯滤波对比')subplot(2,2,1);imshow(grayimg);title('原图');subplot(2,2,2);imshow(image_noise);title('噪声图');subplot(2,2,3);imshow(dstimg_gry);title('my高斯滤波');subplot(2,2,4);imshow(gmf_img);title('matlab高斯滤波');方法2和方法3可参考matlab实现图像滤波——高斯滤波【这篇博文】3.方法3实验结果:实验代码:srcimg=imread('pic_3_x2.jpg');grayimg=rgb2gray(uint8(srcimg));[grayimg_row,grayimg_col]=size(grayimg);sigma =1.6;n =7;n_row =2*n+1;n_col =2*n+1;image_noise =imnoise(grayimg,'gaussian');g_ry =[];fori=1:n_rowforj=1:n_coldistance_s=double((i-n-1)^2+(j-n-1)^2);g_ry(i,j)=exp(-distance_s/(2*sigma*sigma))/(2*pi*sigma*sigma);endendg_ry=g_ry/sum(g_ry(:));dstimg_gry =zeros(grayimg_row,grayimg_col);midimg=zeros(grayimg_row+2*n,grayimg_col+2*n);fori=1:grayimg_rowforj=1:grayimg_colmidimg(i+n,j+n)=image_noise(i,j);endenddstimg_ry=zeros(grayimg_row,grayimg_col);temp=[];for ai=n+1:grayimg_row+nfor aj=n+1:grayimg_col+ntemp_row=ai-n;temp_col=aj-n;temp=0;for bi=1:n_rowfor bj=1:n_rowtemp= temp+(midimg(temp_row+bi-1,temp_col+bj-1)*g_ry(bi,bj));endenddstimg_ry(temp_row,temp_col)=temp;endenddstimg_ry=uint8(dstimg_ry);gausfilter =fspecial('gaussian',[n_row n_col],sigma);gmf_img=imfilter(image_noise,gausfilter,'conv');figure('name','高斯滤波对比')subplot(2,2,1);imshow(grayimg);title('原图');subplot(2,2,2);imshow(image_noise);title('噪声图');subplot(2,2,3);imshow(dstimg_ry);title('my高斯滤波');subplot(2,2,4);imshow(gmf_img);title('matlab高斯滤波');。
Matlab中的混合高斯模型建模方法介绍

Matlab中的混合高斯模型建模方法介绍混合高斯模型(Gaussian Mixture Model,简称GMM)是一种常用的概率模型,用于对数据进行建模和分析。
在Matlab中,通过使用统计和机器学习工具箱(Statistics and Machine Learning Toolbox),可以轻松地实现混合高斯模型的建模和应用。
本文将介绍混合高斯模型的基本概念、建模方法和实际应用,并通过示例演示Matlab工具箱的使用。
1. 混合高斯模型的基本概念混合高斯模型是由若干个高斯分布组合而成的概率模型,每个高斯分布被称为一个混合成分(mixture component)。
每个混合成分具有自己的均值和方差,通过控制每个混合成分所占的权重,可以对不同分布的重要性进行调节。
混合高斯模型可以用于数据的聚类、分类、异常检测等各种应用场景。
2. 混合高斯模型的建模方法在Matlab中,可以使用`gmdistribution.fit()`函数对数据进行混合高斯模型的拟合。
该函数需要输入一个数据集以及所希望拟合的混合高斯模型的数量。
可以通过修改`Options`参数来调整拟合过程中的迭代次数、算法选择等。
3. 混合高斯模型的参数估计拟合完成后,可以通过以下属性来获取混合高斯模型的参数估计:- `mu`:每个混合成分的均值- `Sigma`:每个混合成分的协方差矩阵- `PComponents`:每个混合成分的权重4. 混合高斯模型的应用示例为了更好地理解混合高斯模型在实际应用中的表现,我们以一个虚拟数据集为例进行演示。
假设该数据集包含两个不同的高斯分布。
我们首先生成数据集,并对其进行可视化。
```matlabrng(1); % 设置随机种子data1 = mvnrnd([1, 1], [0.2, 0.1; 0.1, 0.2], 1000);data2 = mvnrnd([-1, -1], [0.2, -0.1; -0.1, 0.2], 1000);data = [data1; data2];scatter(data(:, 1), data(:, 2));```接下来,我们使用GMM对数据进行建模。
一维高斯混合模型密度分布曲面绘制 matlab

一维高斯混合模型密度分布曲面绘制 matlab一维高斯混合模型密度分布曲面绘制 Matlab在探讨一维高斯混合模型密度分布曲面绘制的过程中,我们首先需要了解什么是一维高斯混合模型密度分布。
一维高斯混合模型是指由多个一维高斯分布函数叠加而成的概率密度函数。
在实际应用中,我们往往会遇到多个不同均值和方差的高斯分布,这时我们可以使用一维高斯混合模型来描述数据的分布情况。
在 Matlab 中,我们可以通过使用 gmdistribution 类来创建一维高斯混合模型。
首先我们需要定义每个高斯分布的均值和方差,然后将它们传入 gmdistribution 类中。
接下来,我们可以使用 PDF 函数来计算密度分布,并绘制出一维高斯混合模型密度分布曲面。
下面我将以从简到繁、由浅入深的方式来探讨一维高斯混合模型密度分布曲面绘制的过程,让你能更深入地理解这个主题。
1. 了解一维高斯混合模型密度分布一维高斯混合模型是描述多个一维高斯分布函数叠加而成的概率密度函数。
每个一维高斯分布由均值和方差确定。
在实际应用中,我们会遇到多个具有不同均值和方差的高斯分布,这时可以使用一维高斯混合模型来描述数据的分布情况。
2. 在 Matlab 中创建一维高斯混合模型在 Matlab 中,我们可以使用 gmdistribution 类来创建一维高斯混合模型。
我们需要定义每个高斯分布的均值和方差。
将这些参数传入gmdistribution 类中,创建一维高斯混合模型。
3. 计算密度分布和绘制曲面一旦我们创建了一维高斯混合模型,我们可以使用 PDF 函数来计算密度分布。
我们可以通过绘制曲面的方式来可视化一维高斯混合模型的密度分布。
4. 共享个人观点和理解个人认为,一维高斯混合模型密度分布曲面绘制在数据分析和模式识别中具有重要意义。
通过对数据进行一维高斯混合模型拟合和绘制密度分布曲面,我们可以更清晰地了解数据的分布特征,从而为后续的数据分析和决策提供更加准确的信息。
matlab,生成高斯图像

cl;m=31;n=31;img=zeros(m+1,n+1); %给img赋值一个(n+1)行*2列的全零矩阵img=double(img); %gdouble 就是简单地把一个变量(这里是变量img)类型转换成double 类型,数值大小不变;比如a=6 是个unit8类型的话,double(a)的结果还是6,不过现在这个6是double类型的。
pi=3.1415926;sigma=10;for i=-(m/2):m/2 %给i依次赋值-(m/2)到(m/2)之间的数,每个值都执行for循环中的代码一次。
for j=-(n/2):n/2 %给j依次赋值-(n/2)到(n/2)之间的数,每个值都执行for循环中的代码一次。
img(i+m/2+1,j+n/2+1)=(1/(2*pi*sigma*sigma))*exp(-(i*i+j*j)/(2*sigma*sigma));img(i+m/2+1,j+n/2+1)endendimg=mat2gray(img); %将图像矩阵img归一化为图像矩阵img,归一化后矩阵中每个元素的值都在0到1范围内(包括0和1)。
其中0表示黑色,1表示白色。
imshow(img); %显示img的图像imwrite(img,'pic.bmp'); %图像输出路径是%%下面的代码是对上面的代码进行另一种方式的优化h=5;w=2;[x y]=meshgrid(-w:w,-h:h); %定义数组x,y,x的行向量相当于(-w:w.-h:h),共有n行;y的列向量相当于(-w:w.-h:h),共有n列;n相当于(-w:w.-h:h)中的值的数量。
sigma=5;img = (1/(2*pi*sigma^2))*exp(-(x.^2+y.^2)/(2*sigma^2)); %定义函数img。
Matlab中的背景建模与去除技术

Matlab中的背景建模与去除技术引言在计算机视觉和图像处理领域,背景建模与去除技术是一个重要的研究方向。
它被广泛应用于视频监控、运动分析、虚拟现实等领域。
Matlab作为一个强大的数值计算和图像处理工具,提供了多种背景建模与去除的方法和函数,使得开发者能够更加便捷地进行相关研究和应用开发。
一、背景建模背景建模是通过对连续的视频帧进行分析,从中提取场景的背景信息。
在Matlab中,有多种方法可以进行背景建模。
其中,最常用的方法之一是基于统计模型的背景建模方法。
1. 高斯混合模型(GMM)GMM是一种常用的背景建模方法,它假设一个像素在场景中的亮度值服从多个高斯分布。
通过对每个像素的样本进行聚类分析,可以得到GMM模型中的各个高斯分布的参数(均值、方差、权重)。
这些参数可以用来描述图像中每个像素的背景像素分布,并通过与当前帧像素的比对来判断是否为背景。
2. 自适应混合高斯模型(Adaptive GMM)与传统的GMM方法不同,自适应混合高斯模型在建模过程中不断地适应场景中的变化,从而更加准确地对背景模型进行估计。
这种方法可以有效应对光照变化、摄像机移动等各种因素对背景的影响。
二、背景去除背景去除是指通过对背景模型的分析和处理,从视频中提取出前景对象。
在Matlab中,有多种方法可以进行背景去除。
以下介绍其中两种常用的方法。
1. 帧差法帧差法是最基本的背景去除方法之一,它通过将当前帧与背景帧进行差分运算得到前景像素。
在Matlab中,可以使用absdiff函数实现这一过程。
然后,通过设置一个阈值来判断哪些像素为前景。
这种方法简单易行,但对光照变化和噪声较为敏感。
2. 自适应阈值法自适应阈值法是一种改进的背景去除方法,它通过在空间和时间上进行自适应的像素阈值计算,从而实现对背景的准确去除。
Matlab中提供了诸如graythresh、filt2等函数来实现自适应阈值计算和图像滤波操作,可以帮助开发者更方便地实现自适应阈值法。
混合高斯背景建模matlab代码

clear all% source = aviread('C:\Video\Source\traffic\san_fran_traffic_30sec_QVGA');source = mmreader('SampleVideo.avi');frameQYT=get(source,'NumberOfFrames');% ----------------------- frame size variables -----------------------fr = read(source,1); % 读取第一帧作为背景fr_bw = rgb2gray(fr); % 将背景转换为灰度图像fr_size = size(fr); %取帧大小width = fr_size(2);height = fr_size(1);fg = zeros(height, width);bg_bw = zeros(height, width);% --------------------- mog variables -----------------------------------C = 4; % 组成混合高斯的单高斯数目(一般3-5)M = 0; % 组成背景的数目D = 2.5; % 阈值(一般2.5个标准差)alpha = 0.01; % learning rate 学习率决定更新速度(between 0 and 1) (from paper 0.01)thresh = 0.75; % foreground threshold 前景阈值(0.25 or 0.75 in paper)sd_init = 6; % initial standard deviation 初始化标准差(for new components) var = 36 in paperw = zeros(height,width,C); % initialize weights array 初始化权值数组mean = zeros(height,width,C); % pixel means 像素均值sd = zeros(height,width,C); % pixel standard deviations 像素标准差u_diff = zeros(height,width,C); % difference of each pixel from mean 与均值的差p = alpha/(1/C); % initial p variable 参数学习率(used to update mean and sd)rank = zeros(1,C); % rank of components (w/sd)% ------initialize component means and weights 初始化均值和权值----------pixel_depth = 8; % 8-bit resolution 像素深度为8位pixel_range = 2^pixel_depth -1; % pixel range 像素范围2的7次方0—255(# of possible values)for i=1:heightfor j=1:widthfor k=1:Cmean(i,j,k) = rand*pixel_range; % means random (0-255之间的随机数)w(i,j,k) = 1/C; % weights uniformly distsd(i,j,k) = sd_init; % initialize to sd_initendendend%----- process frames -处理帧--,这里去第八帧n = 8;fr = read(source,n); % read in frame 读取帧fr_bw = rgb2gray(fr); % convert frame to grayscale 转换为灰度图像% calculate difference of pixel values from mean 计算像素差值for m=1:Cu_diff(:,:,m) = abs(double(fr_bw) - double(mean(:,:,m)));end% update gaussian components for each pixel 更新每个像素的背景模型for i=1:heightfor j=1:widthmatch = 0;for k=1:Cif (abs(u_diff(i,j,k)) <= D*sd(i,j,k)) % pixel matches component像素匹配了模型match = 1; % variable to signal component match 设置匹配记号% update weights, mean, sd, 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 % pixel doesn't match component 几个模型中都没有匹配的w(i,j,k) = (1-alpha)*w(i,j,k); % weight slighly decreases 权值减小endendbg_bw(i,j)=0;for k=1:Cbg_bw(i,j) = bg_bw(i,j)+ mean(i,j,k)*w(i,j,k); %更新背景if(bg_bw(i,j)>thresh)k=k-1;M=k;end% 这里有问题,背景权值和大于阈值时,背景建模的数目M取k-1,end% if no components match, create new component 如果没有匹配的模型则创建新模型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;endrank = w(i,j,:)./sd(i,j,:); % calculate component rank 计算模型优先级rank_ind = [1:1:C];% calculate foreground 计算前景while ((match == 0)&&(k>M))% 这里用于前景计算的高斯模型应该是C-M,所以这里k>Mif (abs(u_diff(i,j,rank_ind(k))) <= D*sd(i,j,rank_ind(k)))fg(i,j) = 0; %black = 0elsefg(i,j) = fr_bw(i,j);endk = k+1;if(k==5)k=k-1;breakendendendendfigure(1),subplot(3,1,1),imshow(fr) %显示输入图像subplot(3,1,2),imshow(uint8(bg_bw)) %显示背景图像subplot(3,1,3),imshow(uint8(fg)) %显示前景图像。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
clear all
% source = aviread('C:\Video\Source\traffic\san_fran_traffic_30sec_QVGA');
source = mmreader('SampleVideo.avi');
frameQYT=get(source,'NumberOfFrames');
% ----------------------- frame size variables -----------------------
fr = read(source,1); % 读取第一帧作为背景
fr_bw = rgb2gray(fr); % 将背景转换为灰度图像
fr_size = size(fr); %取帧大小
width = fr_size(2);
height = fr_size(1);
fg = zeros(height, width);
bg_bw = zeros(height, width);
% --------------------- mog variables -----------------------------------
C = 4; % 组成混合高斯的单高斯数目(一般3-5)
M = 0; % 组成背景的数目
D = 2.5; % 阈值(一般2.5个标准差)
alpha = 0.01; % learning rate 学习率决定更新速度(between 0 and 1) (from paper 0.01)
thresh = 0.75; % foreground threshold 前景阈值(0.25 or 0.75 in paper)
sd_init = 6; % initial standard deviation 初始化标准差(for new components) var = 36 in paper
w = zeros(height,width,C); % initialize weights array 初始化权值数组
mean = zeros(height,width,C); % pixel means 像素均值
sd = zeros(height,width,C); % pixel standard deviations 像素标准差
u_diff = zeros(height,width,C); % difference of each pixel from mean 与均值的差p = alpha/(1/C); % initial p variable 参数学习率(used to update mean and sd)
rank = zeros(1,C); % rank of components (w/sd)
% ------initialize component means and weights 初始化均值和权值----------
pixel_depth = 8; % 8-bit resolution 像素深度为8位
pixel_range = 2^pixel_depth -1; % pixel range 像素范围2的7次方0—255(# of possible values)
for i=1:height
for j=1:width
for k=1:C
mean(i,j,k) = rand*pixel_range; % means random (0-255之间的随机数)
w(i,j,k) = 1/C; % weights uniformly dist
sd(i,j,k) = sd_init; % initialize to sd_init
end
end
end
%----- process frames -处理帧--,这里去第八帧
n = 8;
fr = read(source,n); % read in frame 读取帧
fr_bw = rgb2gray(fr); % convert frame to grayscale 转换为灰度图像
% calculate difference of pixel values from mean 计算像素差值
for m=1:C
u_diff(:,:,m) = abs(double(fr_bw) - double(mean(:,:,m)));
end
% update gaussian components for each pixel 更新每个像素的背景模型
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)) % pixel matches component像素匹配了模型
match = 1; % variable to signal component match 设置匹配记号
% update weights, mean, sd, 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 % pixel doesn't match component 几个模型中都没有匹配的
w(i,j,k) = (1-alpha)*w(i,j,k); % weight slighly decreases 权值减小
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); %更新背景
if(bg_bw(i,j)>thresh)
k=k-1;
M=k;
end% 这里有问题,背景权值和大于阈值时,背景建模的数目M取k-1,
end
% if no components match, create new component 如果没有匹配的模型则创建新模型
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;
end
rank = w(i,j,:)./sd(i,j,:); % calculate component rank 计算模型优先级
rank_ind = [1:1:C];
% calculate foreground 计算前景
while ((match == 0)&&(k>M))% 这里用于前景计算的高斯模型应该是C-M,所以这里k>M
if (abs(u_diff(i,j,rank_ind(k))) <= D*sd(i,j,rank_ind(k)))
fg(i,j) = 0; %black = 0
else
fg(i,j) = fr_bw(i,j);
end
k = k+1;
if(k==5)
k=k-1;
break
end
end
end
end
figure(1),subplot(3,1,1),imshow(fr) %显示输入图像
subplot(3,1,2),imshow(uint8(bg_bw)) %显示背景图像
subplot(3,1,3),imshow(uint8(fg)) %显示前景图像。