Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

To resolve issues starting MATLAB on Mac OS X 10.10 (Yosemite) visit: http://www.mathworks.com/matlabcentral/answers/159016

Converting a rectangle position on an image to image matrix index

Asked by Itzik Ben Shabat on 31 Oct 2012

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

0 Comments

Itzik Ben Shabat

Products

No products are associated with this question.

2 Answers

Answer by Matt J on 31 Oct 2012
Edited by Matt J on 31 Oct 2012
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

Itzik Ben Shabat on 31 Oct 2012

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!

Matt J on 31 Oct 2012
 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);
Matt J
Answer by Image Analyst on 31 Oct 2012

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

Itzik Ben Shabat on 1 Nov 2012

thank you :)

Matt J on 1 Nov 2012

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.

Image Analyst on 1 Nov 2012

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.

Image Analyst

Contact us