⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 exview1.m

📁 一种简单快速的视频分割方法
💻 M
字号:
 BW=ones(3,3);
%%%%%%%读取图像并滤波
I1=imread('c:/pict/72.bmp');I1=rgb2gray(I1);I1=medfilt2(I1);
I2=imread('c:/pict/74.bmp');I2=rgb2gray(I2);I2=medfilt2(I2);
I3=imread('c:/pict/75.bmp');I3=rgb2gray(I3);I3=medfilt2(I3);
[r,c]=size(I1);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%利用时域信息求得运动区域的掩模

%%%%%%%%二值化帧差图像(Moving1为中间帧的运动区域)

tic
D2=abs(double(I2)-double(I1));
D3=abs(double(I3)-double(I2));
for i=1:r
    for j=1:c
        if D2(i,j)<=3
            D2(i,j)=0;
        elseif  D3(i,j)<=3
            D3(i,j)=0;
        else D2(i,j)=255;
            D3(i,j)=255;
        end
    end
end
Moving1=D2&D3;
%F=imerode(F,BW);F=imdilate(F,BW);
%%%%%%%%%%%
I1=imread('c:/pict/76.bmp');I1=rgb2gray(I1);I1=medfilt2(I1);
I2=imread('c:/pict/74.bmp');I2=rgb2gray(I2);I2=medfilt2(I2);
I3=imread('c:/pict/77.bmp');I3=rgb2gray(I3);I3=medfilt2(I3);
[r,c]=size(I1);
%%%%%%%%二值化帧差图像(Moving2为中间帧的运动区域)
D22=abs(double(I2)-double(I1));
D32=abs(double(I3)-double(I2));
for i=1:r
    for j=1:c
        if D22(i,j)<=0
            D22(i,j)=0;
        elseif  D32(i,j)<=0
            D32(i,j)=0;
        else D22(i,j)=255;
            D32(i,j)=255;
        end
    end
end
Moving2=D22&D32;
%F2=imerode(F2,BW);F2=imdilate(F2,BW);
Moving=Moving1&Moving2;
%F=imerode(F,BW);F=imdilate(F,BW);
%%%%%%%%%%%
%%%%%%%%%%%
I1=imread('c:/pict/78.bmp');I1=rgb2gray(I1);I1=medfilt2(I1);
I2=imread('c:/pict/74.bmp');I2=rgb2gray(I2);I2=medfilt2(I2);
I3=imread('c:/pict/79.bmp');I3=rgb2gray(I3);I3=medfilt2(I3);
[r,c]=size(I1);
%%%%%%%%二值化帧差图像(Moving3为中间帧的运动区域)
D23=abs(double(I2)-double(I1));
D33=abs(double(I3)-double(I2));
for i=1:r
    for j=1:c
        if D23(i,j)<=0
            D23(i,j)=0;
        elseif  D33(i,j)<=0
            D33(i,j)=0;
        else D23(i,j)=255;
            D33(i,j)=255;
        end
    end
end
Moving3=D23&D33;
%F3=imerode(F3,BW);F3=imdilate(F3,BW);
Moving=Moving&Moving3;
Moving=imerode(Moving,BW);Moving=imdilate(Moving,BW);
Moving=imerode(Moving,BW);Moving=imdilate(Moving,BW);
%%%%%%%%%%%
%%%%%%%%%%%%%%按行扫描得到每行第一个和最后一个边界点,分别放入p,q数组
for i=1:r
   j=1;
  while ( (Moving(i,j)==0)&(j<c) )
         j=j+1;
     end
     p(1,i)=j;
 end

 for i=1:r
   j=c;
   while( (Moving(i,j)==0)&(j>1))
       j=j-1;
   end
   q(1,i)=j;
end
Mask1=zeros(r,c);Mask2=zeros(r,c);
for i=1:r
   for j=p(1,i):q(1,i)  
          Mask1(i,j)=255;
    end   
end
%%%%%%%%%%%%%按列扫描得到每列第一个边界点,放入m数组
for j=1:c
   i=1;
  while ( (Moving(i,j)==0)&(i<r) )
         i=i+1;
     end
    m(1,j)=i;
 end

for j=1:c
      for i=m(1,j):r
        Mask2(i,j)=255;
      end
end
%%%%%%%%%%对扫描得到的运动区域进行先膨胀后腐蚀,消去小区域
Mask=Mask1&Mask2;        %Mask为精确的运动掩模

[l,num]=bwlabel(Mask,8);%标记,l为标记后的矩阵,num为块数
figure
imshow(l);
totle=num
for i=1:num
   a=find(l==i);%返回等于标记为i的位置
   [r1(i),c1(i)]=size(a);%标记为i的像素的数目存放在一维数组中,cl(i)为1,
end
for i=1:num
    if r1(i)<=1000      %将块的阈值大小设定为1000,小于1000的块置零
        a=find(l==i);
        for j=1:r1(i)
            zuob=a(j);
            Mask(zuob)=0;
        end
    end
end
%%%%%%%%%求反去除小的空洞。
B=ones(r,c);
Mask_x=xor(Mask,B);
[lx,numx]=bwlabel(Mask_x,8);
for ix=1:numx
   ax=find(lx==ix);
   [rx(ix),cx(ix)]=size(ax);
end
for ix=1:numx
    if rx(ix)<=50
        ax=find(lx==ix);
        for jx=1:rx(ix)
            zuobx=ax(jx);
            Mask_x(zuobx)=0;
        end
    end
end
toc
Mask=xor(Mask_x,B);Mask=imdilate(Mask,BW);Mask=imdilate(Mask,BW);Mask=imdilate(Mask,BW);Mask=imerode(Mask,BW);Mask=imerode(Mask,BW);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%原图像减去腐蚀图像求得图像的边界图Edge1(利用空域信息得边界)

BW1=ones(5,5);

I21=imerode(I2,BW1);I22=imdilate(I2,BW1);
Edge1=double(I2)-double(I21);

I2w=watershed(I2,4);
[l2,num1]=bwlabel(I2w);
num1
I2c=edge(I2,'canny');
for i=1:r
    for j=1:c
        if Edge1(i,j)<10
            Edge1(i,j)=0;
        else Edge1(i,j)=255;
        end
    end
end
Moving=imdilate(Moving,BW1);Moving=imerode(Moving,BW1);
Moving=imclose(Moving,BW);
I_object=Edge1&Mask;% 运动对象的边界I_object

%%%%%%%%%%%%%%
for i=1:r
   j=1;
  while ( (I_object(i,j)==0)&(j<c) )
         j=j+1;
     end
     p(1,i)=j;
 end

 for i=1:r
   j=c;
   while( (I_object(i,j)==0)&(j>1))
       j=j-1;
   end
   q(1,i)=j;
end
I_mask1=zeros(r,c);I_mask2=zeros(r,c);
for i=1:r
   for j=p(1,i):q(1,i)  
          I_mask1(i,j)=255;
    end   
end
%%%%%%%%%%%%%按列扫描得到每列第一个边界点,放入m数组
for j=1:c
   i=1;
  while ( (I_object(i,j)==0)&(i<r) )
         i=i+1;
     end
    m(1,j)=i;
 end

for j=1:c
      for i=m(1,j):r
        I_mask2(i,j)=255;
      end
end
I_mask=I_mask1&I_mask2;%运动对象掩模I_mask
[l,num]=bwlabel(I_mask,8);  %标记,l为标记后的矩阵,num为块数

for i=1:num
   a=find(l==i);%返回等于标记为i的位置
   [r1(i),c1(i)]=size(a);%标记为i的像素的数目存放在一维数组中,cl(i)为1,
end
for i=1:num
    if r1(i)<=1000      %将块的阈值大小设定为1000,小于1000的块置零
        a=find(l==i);
        for j=1:r1(i)
            zuob=a(j);
            I_mask(zuob)=0;
        end
    end
end
I_mask=imdilate(I_mask,BW);I_mask=imerode(I_mask,BW);
%%%%%%用原来的值填充运动对象掩模得到分割图像I_seg
for i=1:r
   for j=1:c
       if I_mask(i,j)==0
         I_seg(i,j)=0;
       else I_seg(i,j)=I2(i,j);
       end
   end
end

[Isegi,map]=gray2ind(I_seg,256);
Isegc=ind2rgb(Isegi,map);
toc
%figure
%image(Isegc);


figure
subplot(2,3,1);colormap(gray);imagesc(Moving);title('帧运动区域');
subplot(2,3,2);colormap(gray);imagesc(Edge1);title('运动边界');
subplot(2,3,3);colormap(gray);imagesc(I_object);title('运动对象边缘');
subplot(2,3,4);colormap(gray);imagesc(I_mask);title('运动对象掩模');
subplot(2,3,5);imagesc(I2);title('原图像帧');%colormap(gray);
subplot(2,3,6);imagesc(I_seg);title('分割结果');%colormap(gray);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -