How to get matrix indices from roipoly

I have a matrix that I want to extract an ROI from. I am using roipoly to clip the region. The syntax below gives the coordinates of the polygon in the intrinsic coordinate system, I believe. How can I get the matrix indices for each vertex of the polygon?
tst = rand(100);
[xrefout,yrefout,BW,xi2,yi2] = roipoly(tst);
I select some square.
xi2 and yi2 are real valued. To get the pixel value, does one just round xi2 and yi2 to the nearest integer?

 Réponse acceptée

Matt J
Matt J le 10 Sep 2021

0 votes

You must interchange the coordinates (i,j)=(yi2,xi2)

5 commentaires

Paul Safier
Paul Safier le 10 Sep 2021
xi2 and yi2 are not integers and thus not i,j.
Matt J
Matt J le 10 Sep 2021
Well, you can round them as you've already suggested. The main difference between the two coordinate systems though is the ordering.
Paul Safier
Paul Safier le 10 Sep 2021
What doesn't make sense about just rounding the values, is that according to the example shown here:
a value of 3.5 is possible (bottom right). This would round to 4 and thus be out of the domain that only extended from 1 to 3.
Matt J
Matt J le 10 Sep 2021
Modifié(e) : Matt J le 10 Sep 2021
You can threshold the result if you need to, e.g.,
min(max(round(z),1),3)
The rounding is just an approximation step which we are considering here only because you seem to need a result that can be used to index into a matrix. There is no single sacred way to do it. You can choose whatever integer approximation works best for you.
Paul Safier
Paul Safier le 10 Sep 2021
Yep, I see. That'll do. Thanks.

Connectez-vous pour commenter.

Plus de réponses (1)

Image Analyst
Image Analyst le 10 Sep 2021
Try using the mask roipoly() returns:
tst = imread('moon.tif'); % Get some matrix.
imshow(tst); % Display it.
% Ask user to use roipoly.
message = sprintf('Left click vertices.\nRight click last point.\nThen double click inside when you are all done.');
uiwait(helpdlg(message));
mask = roipoly(tst);
% Extract values inside the polygon they drew.
valuesInsideMask = tst(mask)

4 commentaires

Paul Safier
Paul Safier le 10 Sep 2021
Thanks @Image Analyst but I'm after the matrix indices of the roi's vertices. I'm unclear about simply rounding the intrinsic coordinates as it seems possible to obtain an index value out of range; see my comment to Matt J's answer above.
Image Analyst
Image Analyst le 11 Sep 2021
Why do you need only the vertices? What will you do then, once you have them? Nothing further?
Paul Safier
Paul Safier le 11 Sep 2021
The clipped matrix is used as well, sure, but the vertex info is needed elsewhere and printed. It's the vertex info (in indicial format) that I was questioning.
Image Analyst
Image Analyst le 11 Sep 2021
There is also a drawpolygon() function that you might like.

Connectez-vous pour commenter.

Produits

Version

R2020b

Community Treasure Hunt

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

Start Hunting!

Translated by