📄 exview1.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 + -