Converting a rectangle position on an image to image matrix index

Hi, I have drawn an greyscale image from a matrix using imshow. I used Imrect to draw a rectangle on a region of the image. from Imrect i get the xmin, ymin hight and width of the rectangle. but what i really need is to know which pixels it contains e.g the image matrix indexes. how do i do this conversion? thanks

 Accepted Answer

If H is the handle returned by IMRECT, then you can use its createMask method to get a logical index mask of the region,
Indices=H.createMask;

2 Comments

great! did this and its almost what i wanted. i wanted the indexes (rows and columns) if the selected area. is there a simple way to convert the index mask to the (row,column) format? thanks a lot, this helped!
Yes. You use the FIND function
[I,J]=find(mask);
I hope you realize, however, that this conversion is not necessary for indexing the image. You could just use logical indexing:
values = Image(mask);

Sign in to comment.

More Answers (1)

Here's a snippet from my code:
hBox = imrect;
roiPosition = wait(hBox);
roiPosition
% Erase all previous lines.
ClearLinesFromAxes(handles);
xCoords = [roiPosition(1), roiPosition(1)+roiPosition(3), roiPosition(1)+roiPosition(3), roiPosition(1), roiPosition(1)];
yCoords = [roiPosition(2), roiPosition(2), roiPosition(2)+roiPosition(4), roiPosition(2)+roiPosition(4), roiPosition(2)];
% Plot the mask as an outline over the image.
hold on;
plot(xCoords, yCoords, 'linewidth', 2);
Alternatively, if you want, you can use rbbox instead of imrect. Here's a snippet showing how to do that:
k = waitforbuttonpress;
point1 = get(gca,'CurrentPoint'); % button down detected
finalRect = rbbox; % return figure units
point2 = get(gca,'CurrentPoint'); % button up detected
point1 = point1(1,1:2); % extract x and y
point2 = point2(1,1:2);
p1 = min(point1,point2); % calculate locations
offset = abs(point1-point2); % and dimensions
xCoords = [p1(1) p1(1)+offset(1) p1(1)+offset(1) p1(1) p1(1)];
yCoords = [p1(2) p1(2) p1(2)+offset(2) p1(2)+offset(2) p1(2)];
x1 = round(xCoords(1));
x2 = round(xCoords(2));
y1 = round(yCoords(5));
y2 = round(yCoords(3));
hold on
axis manual
plot(xCoords, yCoords); % redraw in dataspace units
croppedImage = imgOriginal(y1:y2,x1:x2,:);

5 Comments

I'm wondering whether this might be sensitive to whichever coordinate system the current axis is using. That's why I would prefer createMask, in addition of course to the fact that it's a 1-liner.
My first example was also just one line "roiPosition = wait(hBox);" if you strip away the call to imrect (like you did) and all the fancy stuff about clearing any previous lines in the overlay and plotting the box over the image after you're done with imrect.
My second example is 3 lines (get(), rbbox(), and get() and skipping all the subsequent fancy stuff) but I actually like rbbox() better than imrect because it allows you to click and drag out a box. I hate the way that imrect works where you get a rectangle with 6 handles on it and then the user has to figure out what to do: "Do I double click inside of it, or do I right click and select Copy Mask - how exactly do I finish this thing off?" It's confusing, unlike rbbox(). If you wanted confirmation you could ask the user afterwards if they want to try again.
I just deal with pixels and both imrect and rbbox return pixels. Any spatial calibration factor I take into account later, by multiplying distances and areas by calibration factors. So I don't really understand what you were wondering about - I guess it never applies to me.
So I don't really understand what you were wondering about - I guess it never applies to me.
I just meant that, for example, when you use get(gca,'CurrentPoint') to obtain coordinates of the box, the output will depend on whether the axes is in matrix mode (axis ij) or xy mode (axis xy). Since the task of the OP is to obtain the pixel coordinates inside the box, you have to make sure the former is true. Conversely, imrect.createMask seems to take care of that for you innately.
Well since I always have loaded an image in first, before calling plot() to plot the box, I guess it's always in pixel mode for me.

Sign in to comment.

Categories

Find more on Function Creation in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!