zoukankan      html  css  js  c++  java
  • 运动元素提取,基于帧间差分与背景差分

      对于某些运动元素的提取,我们仍然可以依据静态图像提取的方法,比如R-G分量差提取等,前提是目标有某些独有的特征。考虑一幅运动图像——

    目标是运动的,背景是禁止的,目标以红色为主,背景含有局部静止的红色。像这种情况单从静态方法分析就很难了。

      对于类似上述的图像,最简单的提取方法是帧间差分与背景差分。这两种算法过程简单,但局限性也明显:帧间差分容易滤掉静止的元素,但提取的

    图像会不完整(有时会只有目标的轮廓),而且比较依赖帧速,帧速慢容易导致ghost现象(提取到两个目标),帧速快可能误判为静止元素而被滤除。背

    景差分可以提取比较完整的目标,但背景的更新是个难题(如原本的运动体在视野范围静止后需要将其归入背景,原本静止的运动体开始运动后需要将其从

    背景里剔除,并且背景的更新同时还要保证提取的完整性)。

      对于帧间差分,通常采用三幅图像的后向差分,可以很好地避免ghost现象;而背景差分可以用两幅图像与背景差分,将差分结果的相同部分在背景里

    更新。本文只探究最基本的算法实现。

      

    帧间差分:

      下图是三幅图像的合成图,可以看到左边红车的位移,右边红车完全静止,如果采用R-G分量不能单独提取出运动车辆。采用三帧间差分的效果左图:

          

    背景差分:

      依然以上面例子为例(省去静止的红车),选择三幅图像。

      首先是三次位移的背景,第一次直接取第一幅图像,这里采用R-B分量差来灰度化(避免斑马线的干扰),后两幅都是更新所得:

          

      然后是三次读取的原图像,采用R-B分量差来灰度化:

          

      最后是背景差分提取的结果:

          

      需要说明的是,这三幅图选得并不连续,如果连续的话,存在车重叠现象,这样比较难更新背景,可能会有更好地算法来消除这个BUG!

      以下是matlab仿真测试代码:

      

    %三帧间差分
    function framediff(prevframefile,curframefile,nxtframefile,thres,destination)
        prevframe=imread(prevframefile);
        curframe=imread(curframefile);
        nxtframe=imread(nxtframefile);
        diffa=uint8(abs(int16(curframe(:,:,1))-int16(prevframe(:,:,1))));
        diffb=uint8(abs(int16(curframe(:,:,1))-int16(nxtframe(:,:,1))));
        [sizex,sizey]=size(diffa);
        
        for i=1:sizex
            for j=1:sizey
                if diffa(i,j)<thres ||diffb(i,j)<thres
                %if diffa(i,j)<thres
                    diffa(i,j)=0;
                else
                    diffa(i,j)=255;
                end
            end
        end
        
        
       imwrite(diffa,destination,'jpg');
       %imshow(diffa);  
    
    end
    %自更新的背景差分
    function backgrounddiff(videofile,start_index,end_index,step,thres)
        video=VideoReader(videofile);
        frame_amount=video.NumberOfFrame;
        width=video.Width;
        height=video.Height;
        if (end_index>frame_amount)
            end_index=frame_amount;             %防止索引出界
        end
        
        %background=rgb2gray(read(video,start_index));
        background=read(video,start_index);
        background=background(:,:,1)-background(:,:,2); %R-G
        %prevdiff=logical(zeros(height,width));
        prevdiff=imbinarize(background,thres/255);
        for i=start_index+step:step:end_index
            imwrite(background,strcat('video','ack',num2str(i),'.jpg'),'jpg');
            %curframe=rgb2gray(read(video,i));
            curframe=read(video,i);
            curframe=curframe(:,:,1)-curframe(:,:,2);
            diffa=uint8(abs(int16(curframe)-int16(background)));
            diffa=imbinarize(diffa,thres/255);
            for j=1:height
                for k=1:width
                    if diffa(j,k)==1&&prevdiff(j,k)==1
                        background(j,k)=curframe(j,k);%更新背景
                        diffa(j,k)=0;
                    end
                end
            end
            
            prevdiff=diffa;
            %imshow(diffa);
            imwrite(curframe,strcat('video','curframe',num2str(i),'.jpg'),'jpg');
            imwrite(diffa,strcat('video','diffb',num2str(i),'.jpg'),'jpg');
        end
            
    end
  • 相关阅读:
    Linux下文件属性(drwxr-xr-x)详解以及(-rwxrwxrwx=777)(转)
    Linux中chown和chmod的区别和用法(转)
    以root用户身份在jenkins中运行shell命令
    Java中Properties配置文件读取
    Java分布式服务框架Dubbo初探(待实践)
    Servlet3.0新特性
    Java中System.getProperty()的参数
    Java获取路径的方法分析详解(Application/Web)
    Java中的JAR/EAR/WAR包的文件夹结构说明(转)
    JAR包中的MANIFEST.MF文件详解以及编写规范
  • 原文地址:https://www.cnblogs.com/kensporger/p/11621127.html
Copyright © 2011-2022 走看看