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

9 Ansichten (letzte 30 Tage)
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?

Akzeptierte Antwort

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

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (4)

Walter Roberson
Walter Roberson am 31 Mai 2011
If you have the image processing toolbox, you can use
bwboundary(I==8)
  3 Kommentare
Walter Roberson
Walter Roberson am 1 Jun. 2011
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 am 2 Jun. 2011
Typo Walter: bwboundaries(I==8)

Melden Sie sich an, um zu kommentieren.


Ivan van der Kroon
Ivan van der Kroon am 31 Mai 2011
[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 Kommentare
Mohammad Golam Kibria
Mohammad Golam Kibria am 5 Jun. 2011
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 am 5 Jun. 2011
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 ?

Melden Sie sich an, um zu kommentieren.


Andrei Bobrov
Andrei Bobrov am 2 Jun. 2011
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 Kommentare
Andrei Bobrov
Andrei Bobrov am 6 Jun. 2011
small correction in answer
Andrei Bobrov
Andrei Bobrov am 6 Jun. 2011
more correction

Melden Sie sich an, um zu kommentieren.


Teja Muppirala
Teja Muppirala am 6 Jun. 2011
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)) )

Kategorien

Mehr zu Shifting and Sorting Matrices finden Sie in Help Center und File Exchange

Produkte

Community Treasure Hunt

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

Start Hunting!

Translated by