经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 编程经验 » 查看文章
运动元素提取,基于帧间差分与背景差分
来源:cnblogs  作者:KenSporger  时间:2019/10/8 9:15:45  对本文有异议

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

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

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

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

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

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

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

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

  

帧间差分:

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

      

 

 

背景差分:

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

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

      

 

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

      

 

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

      

 

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

 

  以下是matlab仿真测试代码:

  

  1. %三帧间差分
  2. function framediff(prevframefile,curframefile,nxtframefile,thres,destination)
  3. prevframe=imread(prevframefile);
  4. curframe=imread(curframefile);
  5. nxtframe=imread(nxtframefile);
  6. diffa=uint8(abs(int16(curframe(:,:,1))-int16(prevframe(:,:,1))));
  7. diffb=uint8(abs(int16(curframe(:,:,1))-int16(nxtframe(:,:,1))));
  8. [sizex,sizey]=size(diffa);
  9. for i=1:sizex
  10. for j=1:sizey
  11. if diffa(i,j)<thres ||diffb(i,j)<thres
  12. %if diffa(i,j)<thres
  13. diffa(i,j)=0;
  14. else
  15. diffa(i,j)=255;
  16. end
  17. end
  18. end
  19. imwrite(diffa,destination,'jpg');
  20. %imshow(diffa);
  21. end
  1. %自更新的背景差分
  2. function backgrounddiff(videofile,start_index,end_index,step,thres)
  3. video=VideoReader(videofile);
  4. frame_amount=video.NumberOfFrame;
  5. width=video.Width;
  6. height=video.Height;
  7. if (end_index>frame_amount)
  8. end_index=frame_amount; %防止索引出界
  9. end
  10. %background=rgb2gray(read(video,start_index));
  11. background=read(video,start_index);
  12. background=background(:,:,1)-background(:,:,2); %R-G
  13. %prevdiff=logical(zeros(height,width));
  14. prevdiff=imbinarize(background,thres/255);
  15. for i=start_index+step:step:end_index
  16. imwrite(background,strcat('video','\back',num2str(i),'.jpg'),'jpg');
  17. %curframe=rgb2gray(read(video,i));
  18. curframe=read(video,i);
  19. curframe=curframe(:,:,1)-curframe(:,:,2);
  20. diffa=uint8(abs(int16(curframe)-int16(background)));
  21. diffa=imbinarize(diffa,thres/255);
  22. for j=1:height
  23. for k=1:width
  24. if diffa(j,k)==1&&prevdiff(j,k)==1
  25. background(j,k)=curframe(j,k);%更新背景
  26. diffa(j,k)=0;
  27. end
  28. end
  29. end
  30. prevdiff=diffa;
  31. %imshow(diffa);
  32. imwrite(curframe,strcat('video','\curframe',num2str(i),'.jpg'),'jpg');
  33. imwrite(diffa,strcat('video','\diffb',num2str(i),'.jpg'),'jpg');
  34. end
  35. end

 

原文链接:http://www.cnblogs.com/kensporger/p/11621127.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号