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
  • 相关阅读:
    poj 3280 Cheapest Palindrome(区间DP)
    POJ 2392 Space Elevator(多重背包)
    HDU 1285 定比赛名次(拓扑排序)
    HDU 2680 Choose the best route(最短路)
    hdu 2899 Strange fuction (三分)
    HDU 4540 威威猫系列故事――打地鼠(DP)
    HDU 3485 Count 101(递推)
    POJ 1315 Don't Get Rooked(dfs)
    脱离eclipse,手动写一个servlet
    解析xml,几种方式
  • 原文地址:https://www.cnblogs.com/kensporger/p/11621127.html
Copyright © 2011-2022 走看看