《图像处理技术》大作业题.pdf
学号:200808205135姓名:柯锦图像处理技术大作业图像处理技术大作业学号:200808205135姓名:柯锦班级:B08082051学院:数计1作业题目基于图像的动态景物的监测与跟踪2作业数据短视频,背景相同,一个目标运动,及多目标运动3基本方法(1)图像增强(2)图像基本运算(3)图像分割见代码注释:单目标主要代码如下function pushbutton4_Callback(hObject,eventdata,handles)%hObjecthandle to pushbutton4(see GCBO)%eventdatareserved-to be defined in a future version of MATLAB%handlesstructure with handles and user data(see GUIDATA)global KeJin;%设置全局变量,用于记录目标单击的按钮axes(handles.axes1);%在 axes1 中处理,实现原动画的显示clear data%数据清理avi=aviread(samplevideo.avi);%读取一个 avi 动画,放到临时数组 avi 中video=avi.cdata;for a=1:length(video)%一帧一帧的读取 video,并调用绘图函数 imagesc 显示每一帧的内容,以达到 avi 动画的播放imagesc(videoa);axis image offdrawnow;end;%handles.keJin=1;%guidata(hObject,handles);KeJin=1;%-Executes on button press in pushbutton5.function pushbutton5_Callback(hObject,eventdata,handles)%hObjecthandle to pushbutton5(see GCBO)%eventdatareserved-to be defined in a future version of MATLAB%handlesstructure with handles and user data(see GUIDA TA)学号:200808205135姓名:柯锦global KeJin;ifKeJin=1axes(handles.axes2);%在 axes2 中处理,实现目标的跟踪的显示clear dataavi=aviread(samplevideo.avi);video=avi.cdata;tracking(video);%调用 tracking 函数,实现动画跟踪(单目标)endifKeJin=2axes(handles.axes2);MovingDetect();%调用 MovingDetect 函数,实现动画跟踪(多目标)endfunction d=tracking(video)%跟踪处理函数,实现一个运动目标的跟踪if ischar(video)%Load the video from an avi file.avi=aviread(video);pixels=double(cat(4,avi(1:2:end).cdata)/255;%将数据缩小 255 倍,然后以第四维进行组合,图像的增强(像素点的值缩小)clear avielse%Compile the pixel data into a single arraypixels=double(cat(4,video1:2:end)/255;%将数据缩小 255 倍,然后以第四维进行组合,图像的增强(像素点的值缩小)clear videoend%Convert to RGB to GRAY SCALE image.nFrames=size(pixels,4);%pixels第四维的大小放在 nFrames 中(总帧数)for f=1:nFrames%对于没一帧,都做如下工作pixel(:,:,f)=(rgb2gray(pixels(:,:,:,f);%转换为灰度图像endrows=240;cols=320;nrames=f;for l=2:nrames%从第二帧到最后一帧,都做如下工作%下句为图像的基本运算,减运算,也是该跟踪的根本算法之一d(:,:,l)=(abs(pixel(:,:,l)-pixel(:,:,l-1);%前后图像相减,得到的矩阵放到 d 中,以实现图像跟踪,此为图像的基本运算k=d(:,:,l);bw(:,:,l)=im2bw(k,.2);%转化为二值图像学号:200808205135姓名:柯锦bw1=bwlabel(bw(:,:,l);imshow(bw(:,:,l)%显示二值图像hold on%右方向为横坐标轴%下方向为纵坐标轴cou=1;for h=1:rowsfor w=1:colsif(bw(h,w,l)0.5)%此处用到图像分割,全局阀值分割toplen=h;%每一帧,如果 cou!=1 的话,下边界纵坐标放在 toplen 中,if(cou=1)tpln=toplen;%每一帧,上边界纵坐标放在tpln 中endcou=cou+1;breakendendend%disp(toplen);coun=1;for w=1:colsfor h=1:rowsif(bw(h,w,l)0.5)%此处用到图像分割,全局阀值分割leftsi=w;%每一帧,如果 coun!=1 的话,右边界横坐标放在leftsi 中if(coun=1)lftln=leftsi;%每一帧,左边界横坐标放在lftln 中coun=coun+1;endbreakendendendwidh=leftsi-lftln;%矩形的长(宽度)heig=toplen-tpln;%矩形的宽(高度)widt=widh/2;heit=heig/2;with=lftln+widt;%中心横坐标heth=tpln+heit;%中心纵坐标rectangle(Position,lftln tpln widh heig,EdgeColor,r);%用红色矩形框住目标,以确定目标位置plot(with,heth,r);%用标出目标的中心drawnow;学号:200808205135姓名:柯锦hold offend;多目标function x=MovingDetect()clear data%初始化背景所需要的帧数N=15;%背景更新参数p1=95;p2=100-p1;M_=1;%读取 AVI 视频文件mov=aviread(My.AVI);%获取视频帧数dimension=size(mov);frameQTY=dimension(2);M=mov;tmFr=rgb2gray(frame2im(mov(1);s=size(tmFr);scrsz=get(0,ScreenSize);%h1=figure(position,scrsz(4)/2,scrsz(4)/2,s(2)*2,s(1)*2);cdataSum=int16(zeros(s);sedisk=strel(rectangle,2,2);sedisk2=strel(rectangle,3,2);count=zeros(s);for c1=1:frameQTY;colorFrC=M(c1);%获取第 i 帧frC=rgb2gray(frame2im(colorFrC);frC=im2frame(frC,gray(256);f=int16(frC.cdata);if(c1=N)%前 N 帧用于背景建模movie(frC,1,15,0,s(1),0,0);%播放第 i 帧%movie(h1,frC,1,15,0,s(1),0,0);%播放第 i 帧cdataSum=cdataSum+f;else%开始运动检测,首先计算出背景if(c1=N+1)cdB=cdataSum/N;else cdB=int16(cdB);endf2=abs(f-cdB);f2=uint8(f2);学号:200808205135姓名:柯锦if(c1=25)disp(1);endbwf=f2;bw=find(f2=45);bwf(bw)=255;%bwf=logical(bwf);cdB=uint8(cdB);f3=imdilate(bwf,sedisk);f3=imerode(f3,sedisk);noSmall=bwareaopen(f3,150);%标签矩阵L=bwlabel(noSmall,4);taggedCars(:,:)=frC.cdata;if any(L(:)stats=regionprops(L,boundingbox,filledArea);for label=1:length(stats)box=stats(label);if(box.FilledArea 0.3)continue;endbox=box.BoundingBox;left=round(box(1);top=round(box(2);right=round(box(1)+box(3)-1);bottom=round(box(2)+box(4)-1);if(abs(top-bottom)/abs(right-left)4|abs(right-left)/abs(top-bottom)4)continue;endtaggedCars(top,left:right)=1;%画矩形框%taggedCars(bottom,left:right)=1;taggedCars(top:bottom,left)=1;taggedCars(top:bottom,right)=1;endend%f5=imdilate(imerode(f,tk1),tk);ff=frC.cdata,cdB;f3,taggedCars;%noSmall,taggedCars学号:200808205135姓名:柯锦ff=im2frame(ff,gray(256);movie(ff,1,15,0,0,0,0);%播放第 i 帧%movie(h1,ff,1,15,0,0,0,0);%播放第 i 帧end%end of if-elseend%-播放结束4作业完成目标:动态目标的定位与跟踪,并用方框提示并给出运动轨迹截图如下:单目标:多目标:部分代码来源于:http:/ d=tracking(video)算法中,矩形边界由下面思路得出:从左到右依次扫描图像,第一个为值为 1 的点的横坐标即为矩形左上角点的横坐标,最后一个为 1 的点的横坐标为矩形右下角横坐标;从上到下第一个值为 1 的点的纵坐标即为矩形左上角的纵坐标,最后一个为 1 的点的纵坐标为矩形右下角纵坐标;矩形的中心也就很容易得出。对于多目标的跟踪,涉及到的方面就很多了,关键就是要解决目标遮挡的问题,由于没有好的思路算法,在加上时间短促,其他科目的学习,此问题始终没能解决。但有如下思路:先采用图像相减,将目标区域(多个)存放在一个三维数组中,当有遮挡时,根据记忆算法,然后还原,即可解决目标遮挡的问题。最后,matlab 语法跟 vc 等有很大的区别,用起来不很方便。还有,我要学习的东西还很多很多。路漫漫其修远兮,吾将上下而求索!