MATLAB은 가우시안 모델을 기반으로 배경 모델링 및 이동 표적 감지 알고리즘을 구현합니다.

가우스 혼합 모델

가우시안 모델을 기반으로 한 배경 모델링 및 이동 표적 탐지 알고리즘은 일반적으로 사용되는 영상 분석 및 컴퓨터 비전 기술입니다. 혼합 가우스 배경 모델링을 사용하여 이진 이미지를 기반으로 움직이는 대상을 추출합니다. 입력 영상 파일의 경우, 영상 속 보행자나 자동차의 움직임을 추출하기 위해 영상의 특정 프레임은 특정 픽셀을 중심으로 하고 인접 픽셀을 갖는 가우스 분포를 나타냅니다.

이 알고리즘의 기본 단계는 다음과 같습니다 .

  1. 초기화: 비디오 시퀀스의 초기 프레임에서 배경 모델을 추출합니다. 배경 모델의 표현으로 각 픽셀의 회색 값이나 색상 특징을 사용하도록 선택할 수 있습니다.

  2. 가우스 모델링: 평균, 분산, 가중치를 포함하여 각 픽셀에 대해 가우스 모델을 유지합니다. 처음에는 각 픽셀의 배경 모델에 일반적으로 가우스 분포가 포함되어 있습니다.

  3. 배경 모델 업데이트: 각각의 새 비디오 프레임에 대해 각 픽셀에 대해 현재 배경 모델과의 차이를 계산합니다. 차이가 특정 임계값보다 작으면 해당 픽셀은 배경으로 간주되고 배경 모델의 매개변수(평균, 분산 및 가중치)가 업데이트됩니다.

  4. 전경 감지: 각 픽셀에 대해 배경 모델과의 차이를 기반으로 전경인지 여부를 판별합니다. 차이가 큰 픽셀은 전경으로 표시되며 움직이는 대상을 나타낼 수 있습니다.

  5. 표적 분할 및 추적: 전경 탐지 결과를 기반으로 표적 분할 및 추적을 수행하여 비디오 시퀀스에서 움직이는 표적을 식별하고 추적할 수 있습니다.

가우시안 모델을 기반으로 한 배경 모델링 및 움직이는 표적 감지 알고리즘은 조명 변화 , 동적 배경 등이 있는 복잡한 장면 이나 상황을 처리할 때 일부 제한이 있을 수 있다는 점에 유의해야 합니다. 따라서 실제 적용에서는 감지 정확도견고성을 향상시키기 위해 다른 기술과 개선된 알고리즘을 결합해야 할 수도 있습니다 .

Matlab은 가우시안 모델을 기반으로 배경 모델링 및 이동 대상 감지 알고리즘을 구현합니다.

clear all
clc;
close all;

source = VideoReader('one.mp4');
ResVid = VideoWriter('second.avi');
open(ResVid);
numFrames = source.NumberOfFrames;
%vidFrames = read(source);
% -----------------------  frame size variables -----------------------
%
%fr = source(1).cdata;           % read in 1st frame as background frame
fr= read(source,1);
fr_bw = rgb2gray(fr);     % convert background to greyscale
fr_size = size(fr);            
width = fr_size(2);
height = fr_size(1);
fg = zeros(height, width); % 用于计算前景,储存前景像素
bg_bw = zeros(height, width);% 用于背景的更新

% --------------------- mog variables -----------------------------------

C = 3;                                  % number of gaussian components (typically 3-5)高斯个数
M = 3;                                  % number of background components背景个数
D = 2.5;                                % positive deviation threshold比较门槛值
alpha = 0.01;                           % learning rate (between 0 and 1) (from paper 0.01)初始化的学习率
thresh = 0.25;                          % foreground threshold (0.25 or 0.75 in paper)前景门槛
sd_init = 3;                            % 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
pixel_range = 2^pixel_depth -1;         % pixel range (# 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 -----------------------------------

% for n = 1:length(source)% 计算视频的总帧数
for n = 30:numFrames
    fprintf("Num: %d \n",n);    % disp(['Num: ' num2str(n)]); (运行失败可代替代码)
    %fr = source(n).cdata;      % read in frame改
    fr = read(source,n);
    fr_bw = rgb2gray(fr);       % convert frame to grayscale
    %所以fr_bw(i,j)可以认为是当前像素点吧

    % 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
                                                              % pixel matches component
                                                        % 当前像素与某一高斯模型匹配,匹配准
                                                        % 则是与高斯模型差值小与2.5倍的标准差                                                        
                    match = 1;                          % variable to signal 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

            w(i,j,:) = w(i,j,:)./sum(w(i,j,:));% 各个像素所有高斯背景模型的值之和,一个统计值

            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);%更新背景
                %%5............
                 %if(bg_bw(i,j)>thresh)
                  % k=k-1;
                 %  M=k;
                %end%????..........
            end

            % if no components match, create new component
            % 当所有的高斯模型都不匹配的时候,用当前的图像参数建立一个新的高斯模型,取代权重最小的模型
            if (match == 0)
                [min_w, min_w_index] = min(w(i,j,:));  %找出每一个像素对应的权重最小的高斯模型
                                                       %找出w中的所有维数(也就是所有高斯模型)对应的第i行,第j列的最小值(也就是权重),
                                                       %返回值min_w为数值(权重)大小,min_w_index为对应的维数(高斯模型)
                mean(i,j,min_w_index) = double(fr_bw(i,j));%fr_bw为背景灰度图像,由于没有匹配,所以保留原值不变
                                                       %我认为是当前像素值作为新模型的均值
                sd(i,j,min_w_index) = sd_init;%没有匹配,保留原值不变
            end

            rank = w(i,j,:)./sd(i,j,:);                % calculate component rank
            rank_ind = [1:1:C];                        %计算权重与标准差的比值,用于对背景模型进行排序

            % sort rank values
            for k=2:C               
                for m=1:(k-1)

                    if (rank(:,:,k) > rank(:,:,m))                     
                        % swap max values
                        rank_temp = rank(:,:,m);  
                        rank(:,:,m) = rank(:,:,k);
                        rank(:,:,k) = rank_temp;

                        % swap max index values
                        rank_ind_temp = rank_ind(m);  
                        rank_ind(m) = rank_ind(k);
                        rank_ind(k) = rank_ind_temp;   

                    end
                end
            end

            % calculate foreground%计算前景
            match = 0;
            k=1;

            fg(i,j) = 0; %前景
            while ((match == 0)&&(k<=M))% 没有匹配,而且当前高斯数号小于背景数

                if (w(i,j,rank_ind(k)) >= thresh)
                    if (abs(u_diff(i,j,rank_ind(k))) <= D*sd(i,j,rank_ind(k)))
                        fg(i,j) = 0; %判断是否是前景,如果符合匹配准则就认为是背景
                        match = 1;
                    else                   %否则认为是前景,前景值为255,即白色
                        fg(i,j) = 255;
                    end
                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))%显示背景图像三行一列定位第2个
subplot(3,1,3),imshow(uint8(fg)) %显示前景图像

pause(0.5);

BG = uint8(zeros(size(fr)));
BG(:,:,1) = uint8(fg);
BG(:,:,2) = uint8(fg);
BG(:,:,3) = uint8(fg);
Res = [fr BG];
%将图像矩阵转换为视频帧
% Mov1(n)  = im2frame(uint8(fg),gray);           % put frames into movie前景帧
% Mov2(n)  = im2frame(uint8(bg_bw),gray);           % put frames into movie背景帧
writeVideo(ResVid,Res);

end      
close(ResVid);
% movie2avi(Mov1,'mixture_of_gaussians_output','fps',30);           % save movie as avi
% movie2avi(Mov2,'mixture_of_gaussians_background','fps',30);           % save movie as avi

위 코드를 간략하게 분석해 보세요.

  1. 먼저 코드는 VideoReader함수를 통해 'one.mp4'라는 동영상 파일을 열고, VideoWriter함수를 통해 'second.avi'라는 동영상 작성 개체를 생성합니다.

하나

두번째
알고리즘 실행 결과:
알고리즘 결과

  1. 코드는 비디오의 총 프레임 수를 가져와 변수에 저장합니다 numFrames.

  2. 초기화 단계에서 코드는 가우스 모델 수(C), 배경 모델 수(M), 표준 편차의 초기 값(sd_init) 등과 같은 일부 매개변수를 정의하고 해당 배열을 생성합니다. 모델을 저장하기 위한 가중치, 평균 및 표준 편차.

  3. 다음은 프레임 루프 처리의 주요 부분입니다. 코드는 프레임별로 비디오의 이미지를 읽고 각 프레임을 회색조 이미지로 변환합니다. 그런 다음 각 픽셀에 대해 코드는 해당 픽셀과 각 가우스 모델 간의 차이를 계산하고 일치 및 업데이트를 수행합니다. 픽셀이 배경 가우스 모델과 일치하면 모델의 가중치, 평균 및 표준 편차가 업데이트됩니다. 픽셀이 어떤 모델과도 일치하지 않으면 새로운 가우스 모델이 생성됩니다.

  4. 또한 코드는 표준 편차에 대한 가중치 비율을 기준으로 배경 모델의 순위를 매기고 전경을 계산합니다. 마지막으로 코드는 원본 프레임, 배경 이미지, 전경 이미지를 세 개의 하위 이미지로 표시하고 해당 프레임을 'second.avi' 비디오에 씁니다.

전체적으로 각 모델과의 픽셀값 차이를 매칭하여 해당 픽셀이 배경에 속하는지 전경에 속하는지 판단하고, 매칭 결과에 따라 모델 매개변수를 업데이트합니다.

추천

출처blog.csdn.net/weixin_52374973/article/details/130874299