How to find x,y matrix using for sintax
3 views (last 30 days)
Show older comments
i have been working for my thesis about image segmentation. i have this matrix
a =
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 1 1 0 0
0 0 0 0 1 1 1 1 1 0
0 0 0 0 0 1 1 0 0 0
0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0
and then i want to find the first x,y with binary 1 using for sintax this is the one i use but its not working
---------------------------------------------
function [x1,y1,x2,y2,x3,y3,x4,y4]=gedge(x)
[m,n]=size(x);
% upper edge xy
for i=1:m
for j=1:n
if(x(i,j)==1)
x1=i;
y1=j;
break
end
end
end
% left edge xy
for j=1:n
for i=1:m
if(x(i,j)==1)
x2=i;
y2=j;
break
end
end
end
% bottom edge xy
for i=m:-1:1
for j=n:-1:1
if(x(i,j)==1)
x3=i;
y3=j;
break
end
end
end
% right edge xy
for j=n:-1:1
for i=m:-1:1
if(x(i,j)==1)
x4=i;
y4=j;
break
end
end
end
%for the cropping
y=x(x1:x4,y2:y3);
-----------------------------------------------------------------
so i want to erase the 0 binary for my image segmentation. it will be this matrix:
a =
0 1 1 1 0
1 1 1 1 1
0 1 1 0 0
0 1 0 0 0
please help recorrect my sintax code. Thanks
0 Comments
Accepted Answer
random09983492
on 20 Jun 2013
Hi,
Here is my implementation. Let me know if there is something you do not understand.
[r,c] = size(a);
% Starts at bottom row and removes rows that have nothing in them.
for i = fliplr(1:r)
if sum(a(i,:)) == 0
a(i,:) = [];
else
break;
end
end
% Starts from right-most column and removes columns with nothing in them.
for i = fliplr(1:c)
if sum(a(:,i)) == 0
a(:,i) = [];
else
break;
end
end
% Starts at top row, counts number of empty rows until it gets to a
% non-empty row. These cannot be removed immediately or it will screw up
% the for-loop.
top_count = 0;
for i = 1:r
if sum(a(i,:)) == 0
top_count = top_count + 1;
else
break;
end
end
% Starts at left-most column, counts number of empty columns until it gets
% to a non-empty column. These cannot be removed immediately or it will
% screw up the for-loop.
left_count = 0;
for i = 1:c
if sum(a(:,i)) == 0
left_count = left_count + 1;
else
break;
end
end
% Now left-most empty columns and top empty rows can be safely removed.
if top_count > 0
a(1:top_count,:) = [];
end
if left_count > 0
a(:,1:left_count) = [];
end
More Answers (2)
Jonathan Sullivan
on 20 Jun 2013
Edited: Jonathan Sullivan
on 20 Jun 2013
It's really simple if you use the functions find and any. See below:
ind1 = find(any(x == 1,2),1);
ind2 = find(any(x == 1,2),1,'last');
ind3 = find(any(x == 1,1),1);
ind4 = find(any(x == 1,1),1,'last');
y = x(ind1:ind2,ind3:ind4);
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!