how to detect empty rows and columns from 3-D matrix and crop them?
6 次查看(过去 30 天)
显示 更早的评论
I have a 3-D matrix as a video. It contains empty (0) zero values along the tree dimentions.
The matrix is represented as a video. So I need to:
- if the row along the frames is empty (==0), I want to crop it.
- if the column along the frames is empty (==0), I want to crop it
I have an example 3-D dimention but I need a general method.
I have tried to write something but there is something wrong.
Please Help.
%% define the video (3-D matrix)
Frames = [0 0 90 0 0; 0 0 90 0 0; 90 90 90 0 0;0 0 0 0 0;0 0 0 0 0];
Frames(:,:,2 ) = [0 0 0 0 0;0 0 90 0 0; 0 0 90 0 0; 90 90 90 0 0;0 0 0 0 0];
Frames(:,:,3 ) = [0 0 0 0 0;0 0 90 0 0; 0 0 90 0 0; 90 90 90 0 0;0 0 0 0 0];
Frames(:,:,4 ) = [0 0 0 0 0;0 0 90 0 0; 0 0 90 0 0; 90 90 90 0 0;0 0 0 0 0];
Frames(:,:,5 ) = [0 0 0 0 0;0 0 90 0 0; 0 0 90 0 0; 90 90 90 0 0;0 0 0 0 0];
Frames(:,:,6 ) = [0 0 0 0 0;0 0 90 0 0; 0 0 90 0 0; 90 90 90 0 0;0 0 0 0 0];
Frames(:,:,7 ) = [0 0 90 0 0; 0 0 90 0 0; 90 90 90 0 0;0 0 0 0 0;0 0 0 0 0];
Frames(:,:,8 ) = [0 0 0 0 0;0 0 90 0 0; 0 0 90 0 0; 90 90 90 0 0;0 0 0 0 0];
Frames(:,:,9 ) = [0 0 0 0 0;0 0 90 0 0; 0 0 90 0 0; 90 90 90 0 0;0 0 0 0 0];
Frames(:,:,10) = [0 0 0 0 0;0 0 90 0 0; 0 0 90 0 0; 90 90 90 0 0;0 0 0 0 0];
%% define some varibles
%% n & m are zeros counters
%% x,y,z are lengths along the three dimentions
n=0;
m=0;
x=length(Frames(:,1,1));
y=length(Frames(1,:,1));
z=length(Frames(1,1,:));
%% if the row along the frames is empty (==0),crop it.
%% r for row
% %% c for columns
% %% f for frames
for c=1:y
for r=1:x
for f=1:z
if Frames(r,c,f)==0 %detect
m=m+1;
end
end
if m==25
Frames(:,c,:) = []; %crop
end
end
end
%% %% if the column along the frames is empty (==0),crop it.
%% r for row
% %% c for columns
% %% f for frames
for r=1:x
for c=1:y
for f=1:z
if Frames(r,c,f)==0 %detect
n=n+1;
end
end
if m==25
Frames(r,:,:) = []; %crop
end
end
end
0 个评论
采纳的回答
更多回答(2 个)
Stephan
2018-12-31
编辑:Stephan
2018-12-31
Hi,
two lines of code do the job:
Frames = zeros(5,5,10);
Frames(:,:,1 ) = [0 0 90 0 0; 0 0 90 0 0; 90 90 90 0 0;0 0 0 0 0;0 0 0 0 0];
Frames(:,:,2 ) = [0 0 0 0 0;0 0 90 0 0; 0 0 90 0 0; 90 90 90 0 0;0 0 0 0 0];
Frames(:,:,3 ) = [0 0 0 0 0;0 0 90 0 0; 0 0 90 0 0; 90 90 90 0 0;0 0 0 0 0];
Frames(:,:,4 ) = [0 0 0 0 0;0 0 90 0 0; 0 0 90 0 0; 90 90 90 0 0;0 0 0 0 0];
Frames(:,:,5 ) = [0 0 0 0 0;0 0 90 0 0; 0 0 90 0 0; 90 90 90 0 0;0 0 0 0 0];
Frames(:,:,6 ) = [0 0 0 0 0;0 0 90 0 0; 0 0 90 0 0; 90 90 90 0 0;0 0 0 0 0];
Frames(:,:,7 ) = [0 0 90 0 0; 0 0 90 0 0; 90 90 90 0 0;0 0 0 0 0;0 0 0 0 0];
Frames(:,:,8 ) = [0 0 0 0 0;0 0 90 0 0; 0 0 90 0 0; 90 90 90 0 0;0 0 0 0 0];
Frames(:,:,9 ) = [0 0 0 0 0;0 0 90 0 0; 0 0 90 0 0; 90 90 90 0 0;0 0 0 0 0];
Frames(:,:,10) = [0 0 0 0 0;0 0 90 0 0; 0 0 90 0 0; 90 90 90 0 0;0 0 0 0 0];
% crop all empty rows and columns
Frames(:,find(sum(Frames,[1 3])==0),:)=[];
Frames(find(sum(Frames,[2 3])==0),:,:)=[]
disp('Please accept useful answers.')
Best regards
Stephan
2 个评论
Luna
2018-12-31
编辑:Luna
2018-12-31
Hi,
Try this below:
%% delete zero rows
Frames = reshape(Frames(bsxfun(@times,any(Frames,2),ones(1,size(Frames,2)))>0),[],size(Frames,2),size(Frames,3));
%% delete zero columns
Frames = reshape(Frames(bsxfun(@times,any(Frames,1),ones(size(Frames,1),1))>0),size(Frames,1),[],size(Frames,3));
you will get 3x3x10 matrix
6 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Matrix Indexing 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!