您现在的位置:首页 >> 图像处理 >> 内容

m基于背景差法与GMM混合高斯模型结合的红外目标检测与跟踪算法matlab仿真

时间:2023/2/8 20:24:52 点击:

  核心提示:10_022_m,包括程序操作录像+说明文档...

1.完整项目描述和程序获取

>面包多安全交易平台:https://mbd.pub/o/bread/Y56cmZdr

>如果链接失效,可以直接打开本站店铺搜索相关店铺:

点击店铺

>如果链接失效,程序调试报错或者项目合作可以加微信或者QQ联系。

2.部分仿真图预览



3.算法概述

        混合高斯模型使用K(基本为3到5个) 个高斯模型来表征图像中各个像素点的特征,在新一帧图像获得后更新混合高斯模型,用当前图像中的每个像素点与混合高斯模型匹配,如果成功则判定该点为背景点, 否则为前景点。通观整个高斯模型,他主要是有方差和均值两个参数决定,,对均值和方差的学习,采取不同的学习机制,将直接影响到模型的稳定性、精确性和收敛性。由于我们是对运动目标的背景提取建模,因此需要对高斯模型中方差和均值两个参数实时更新。为提高模型的学习能力,改进方法对均值和方差的更新采用不同的学习率;为提高在繁忙的场景下,大而慢的运动目标的检测效果,引入权值均值的概念,建立背景图像并实时更新,然后结合权值、权值均值和背景图像对像素点进行前景和背景的分类。

4.部分源码

Time1 = 0;

tic;

for tt = 1:round(frameNum_Original)

    disp('当前帧数');

    tt

    image = Temp(:,:,tt);

    for kk = 1:K   

        Datac         = double(Temp(:,:,tt))-reshape(Mus(:,kk,:),D,CRGB);

        Squared(:,kk) = sum((Datac.^ 2)./reshape(Sigmas(:,kk,:),D,CRGB),2); 

    end

    [junk,index] = min(Squared,[],2); 

    Gaussian                                                = zeros(size(Squared));

    Gaussian(sub2ind(size(Squared),1:length(index),index')) = ones(D,1);

    Gaussian                                                = Gaussian&(Squared<Deviation_sq);

    %参数更新

    Weights = (1-Alpha).*Weights+Alpha.*Gaussian;

    for kk = 1:K

        pixel_matched   = repmat(Gaussian(:,kk),1,CRGB);

        pixel_unmatched = abs(pixel_matched-1);

        Mu_kk           = reshape(Mus(:,kk,:),D,CRGB);

        Sigma_kk        = reshape(Sigmas(:,kk,:),D,CRGB);

        Mus(:,kk,:)     = pixel_unmatched.*Mu_kk+pixel_matched.*(((1-Rho).*Mu_kk)+(Rho.*double(image)));

        Mu_kk           = reshape(Mus(:,kk,:),D,CRGB); 

        Sigmas(:,kk,:)  = pixel_unmatched.*Sigma_kk+pixel_matched.*(((1-Rho).*Sigma_kk)+repmat((Rho.* sum((double(image)-Mu_kk).^2,2)),1,CRGB));       

    end

    replaced_gaussian   = zeros(D,K); 

    mismatched          = find(sum(Gaussian,2)==0);       

    for ii = 1:length(mismatched)

        [junk,index]                            = min(Weights(mismatched(ii),:)./sqrt(Sigmas(mismatched(ii),:,1)));

        replaced_gaussian(mismatched(ii),index) = 1;

        Mus(mismatched(ii),index,:)             = image(mismatched(ii),:);

        Sigmas(mismatched(ii),index,:)          = ones(1,CRGB)*Variance;

        Weights(mismatched(ii),index)           = Props;  

    end

    Weights         = Weights./repmat(sum(Weights,2),1,K);

    active_gaussian = Gaussian+replaced_gaussian;

    %背景分割 

    [junk,index]    = sort(Weights./sqrt(Sigmas(:,:,1)),2,'descend');

    bg_gauss_good   = index(:,1);

    linear_index    = (index-1)*D+repmat([1:D]',1,K);

    weights_ordered = Weights(linear_index);

    for kk = 1:K

        Weight(:,kk)= sum(weights_ordered(:,1:kk),2);

    end

    bg_gauss(:,2:K) = Weight(:,1:(K-1)) < Back_Thresh;

    bg_gauss(:,1)   = 1;           

    bg_gauss(linear_index)     = bg_gauss;

    active_background_gaussian = active_gaussian & bg_gauss;

    foreground_pixels          = abs(sum(active_background_gaussian,2)-1);

    foreground_map             = reshape(sum(foreground_pixels,2),RR,CC);

    Images1(:,:,tt)            = foreground_map;   

    objects_map                = zeros(size(foreground_map),'int32');

    object_sizes               = [];

    Obj_pos                    = [];

    new_label                  = 1;

    %计算连通区域

    [label_map,num_labels]     = bwlabel(foreground_map,8);

    

    for label = 1:num_labels 

       object      = (label_map == label);

       object_size = sum(sum(object));

       if(object_size >= Comp_Thresh)

          objects_map             = objects_map + int32(object * new_label);

          object_sizes(new_label) = object_size;

          [X,Y]                   = meshgrid(1:CC,1:RR);    

          object_x                = X.*object;

          object_y                = Y.*object;

          Obj_pos(:,new_label)    = [sum(sum(object_x)) / object_size;

                     sum(sum(object_y)) / object_size];

          new_label               = new_label + 1;

       end

    end

    num_objects = new_label - 1;

    %去除阴影

    index                       = sub2ind(size(Mus),reshape(repmat([1:D],CRGB,1),D*CRGB,1),reshape(repmat(bg_gauss_good',CRGB,1),D*CRGB,1),repmat([1:CRGB]',D,1));

    background                  = reshape(Mus(index),CRGB,D);

    background                  = reshape(background',RR,CC,CRGB); 

    background                  = uint8(background);

    background_Update(:,:,:,tt) = background;

    background_hsv              = rgb2hsv(background);

    image_hsv                   = rgb2hsv(image_sequence(:,:,:,tt));

    for i = 1:RR

        for j = 1:CC      

            if (objects_map(i,j))&&...

               (abs(image_hsv(i,j,1)-background_hsv(i,j,1))<SHADOWS(1))&&...

               (image_hsv(i,j,2)-background_hsv(i,j,2)<SHADOWS(2))&&...

               (SHADOWS(3)<=image_hsv(i,j,3)/background_hsv(i,j,3)<=SHADOWS(4))

               Shadows(i,j) = 1;  

            else

               Shadows(i,j) = 0;  

            end               

        end    

    end

    Images0(:,:,tt)   = objects_map;

    objecs_adjust_map = Shadows;

    Images2(:,:,tt)   = objecs_adjust_map;    

    

    Images3(:,:,tt)= Images2(:,:,tt);

end

Time1 = toc/frameNum_Original;

msgbox(['视频每帧耗时:',num2str(Time1),'s']);

axes(handles.axes2)

imshow(uint8(background_Update(:,:,:,end)));

drawnow;

10_022_m

作者:我爱C编程 来源:我爱C编程
本站最新成功开发工程项目案例
相关文章
  • 没有相关文章
相关评论
发表我的评论
  • 大名:
  • 内容:
本类固顶
  • 没有
  • FPGA/MATLAB商业/科研类项目合作(www.store718.com) © 2025 版权所有 All Rights Reserved.
  • Email:1480526168@qq.com 站长QQ: 1480526168