How do I find the boundaries of a value in a matrix?

조회 수: 8 (최근 30일)
Mohammad Golam Kibria
Mohammad Golam Kibria 2011년 5월 31일
Hi, I have a matrix as follows:
I =
1 1 1 1 8 1 2
1 1 8 8 8 2 1
1 8 8 1 2 1 1
1 1 8 2 1 1 1
2 2 2 1 1 1 1
2 2 2 1 1 1 1
I want a matrix which will be output of boundary value of 8 i.e. (1,5),(2,3),(2,4),(2.5),(3,2),(3.3),(4.3)
Is there any way to he find these location easily?

채택된 답변

Sean de Wolski
Sean de Wolski 2011년 6월 3일
[r c] = find(bwperim(I==8));
  댓글 수: 3
Walter Roberson
Walter Roberson 2011년 6월 5일
That's because you keep changing the stated requirements :(
Ivan van der Kroon
Ivan van der Kroon 2011년 6월 6일
This method and Andrei's still gives the (1,4) and leaves the (3,3).

댓글을 달려면 로그인하십시오.

추가 답변 (4개)

Walter Roberson
Walter Roberson 2011년 5월 31일
If you have the image processing toolbox, you can use
bwboundary(I==8)
  댓글 수: 3
Walter Roberson
Walter Roberson 2011년 6월 1일
http://www.mathworks.com/help/toolbox/images/ref/bwboundaries.html
It appears you do not have the Image Processing Toolbox installed, or else you have a very old version. The Image Processing Toolbox is extra cost for all MATLAB editions except for the Student Edition.
Sean de Wolski
Sean de Wolski 2011년 6월 2일
Typo Walter: bwboundaries(I==8)

댓글을 달려면 로그인하십시오.


Ivan van der Kroon
Ivan van der Kroon 2011년 5월 31일
[rows,cols]=find(I==8)
rows =
3
2
3
4
2
1
2
cols =
2
3
3
3
4
5
5
Hope this helps.
  댓글 수: 7
Mohammad Golam Kibria
Mohammad Golam Kibria 2011년 6월 5일
I =
1 1 8 8 8 1 2
1 1 8 8 8 2 1
1 8 8 8 8 1 1
1 1 8 2 1 1 1
2 2 2 1 1 1 1
2 2 2 1 1 1 1
output needs the following:
(1,3) (1,5) (2,3) (2,5)(3,2)(3,3)(3,4)(3,5) (4,3)
perhaps this will help for better understanding my output
Walter Roberson
Walter Roberson 2011년 6월 5일
So to confirm, any "8" that has only 8's as neighbors is to be excluded, and all other 8's are to be included?
If the entire matrix was 2x2 and was
88
88
then everything should be excluded?
and for
881
888
881
then the entire left side is to be excluded?
Just include the 8's for which at least one of the neighbors is a non-8 ?

댓글을 달려면 로그인하십시오.


Andrei Bobrov
Andrei Bobrov 2011년 6월 2일
more variant
I1 = I == 8;
l1 = [ones(1,size(I1,2)); diff(I1)~=0];
l2 = [ones(size(I1,1),1) diff(I1,1,2)~=0];
lud = [l1(2:end,:);false(1,size(I1,2))];
llr = [l2(:,2:end) false(size(I1,1),1)];
[j i] = find(((lud+l1+llr+l2)&I1)');
out = [i j];
more more variant
I1 = I==8;
I2=ones(size(I1)+2);
I2(2:end-1,2:end-1) = I1;
I1(conv2(I2,ones(3),'valid')==9)=0;
[i j] = find(I1);
without conv2
I1 = I==8;
I2=ones(size(I1)+2);
I2(2:end-1,2:end-1) = I1;
[i j] = find(I1);
ij1 = [i j];
ij2 = ij1 + 1;
IJ = arrayfun(@(x)bsxfun(@plus,ij2(:,x),[-1 0 1]),1:size(ij2,2),'un',0);
ij1(arrayfun(...
@(x)sum(reshape(I2(IJ{1}(x,:),IJ{2}(x,:)),[],1)),1:size(ij2))==9,:) = [];
  댓글 수: 3
Andrei Bobrov
Andrei Bobrov 2011년 6월 6일
small correction in answer
Andrei Bobrov
Andrei Bobrov 2011년 6월 6일
more correction

댓글을 달려면 로그인하십시오.


Teja Muppirala
Teja Muppirala 2011년 6월 6일
This will give all the 8's that are not entirely surrounded by other 8's. Assuming you have the Image Processing Toolbox.
[i,j] = find( (I==8) - imerode(I==8,ones(3)) )

카테고리

Help CenterFile Exchange에서 Matrix Indexing에 대해 자세히 알아보기

제품

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by