MATLAB Answers

How to crop an image inside a boundary ?

40 views (last 30 days)
I have an image from which I want to crop a certain portion of it. I drew the boundary at first. Below is the code:
img = imread('Intensity1.jpg');
figure, imshow(img);
% getting a segment
h=drawfreehand();
position = wait(h);
region=uint8(roipoly(img,position(:,1),position(:,2)));
region=region.*img;
figure,imshow(region); title('Segmented Region');
% use bwperim rather than bwboundaries to get an Image of boundary.
boundImg = uint8(bwperim(rgb2gray(region),4));
boundImg(boundImg ~=0) = max(img(:));
figure, imshow(img + boundImg)
% save image without loosing information..
imwrite(img + boundImg, 'writeImg.jpg');
% check
read = imread('writeImg.jpg');
figure, imshow(read)
isequal(read, img + boundImg)
The image is below:
fh.jpg
I want to crop the portion of the image specified by the boundary above. I tried the following line of code but there is no change in the result.
imcrop('Intensity1.jpg');
Any suggestions would be very much appreciated. Thank you.

  3 Comments

Kristen Meyer
Kristen Meyer on 19 Jul 2019
So your image is read and you have a matrix discribing the selected area?
for i = 1:numCol
read(lowerRowIndexOfSelectionAtCol_i:end,i,:) = [];
read(1:upperRowIndexOfSelectionAtCol_i,i,:) = [];
end
Goes column by column and removes above and below selected area. Hopfully it's enough to get you where you need to go.
KALYAN ACHARJYA
KALYAN ACHARJYA on 20 Jul 2019
@Warid Please do clarify your job to segment the yellowish region or extracts marked ROI only?
Warid Islam
Warid Islam on 22 Jul 2019
Hi Kalyan,
I want to extract the marked ROI only.

Sign in to comment.

Accepted Answer

Divya Gaddipati
Divya Gaddipati on 24 Jul 2019
region=uint8(roipoly(img,position(:,1),position(:,2)));
After getting the mask of the selected region from the above line in your code, you can use regionprops to obtain a rectangular box around the mask and then use imcrop to crop the image.
stats = regionprops(region, 'BoundingBox');
crop_region = stats.BoundingBox; % contains [top_left_x top_left_y width height]
cropped_img = imcrop(img, crop_region);
For more information on how to use regionprops and imcrop, refer to the following links:

  2 Comments

Warid Islam
Warid Islam on 24 Jul 2019
Hi Divya,
Thank you for your response. I tried the above line of code but somehow I don't get any option to crop. I get the following error message.
Undefined function 'wait' for input arguments of type 'images.roi.Freehand'.
Error in fh4 (line 5)
position = wait(h);
Divya Gaddipati
Divya Gaddipati on 26 Jul 2019
Hi,
I assume you are using the wait command to obtain the positions of the selected boundary from.
The drawfreehand command returns an object which contains the positions of the boundary you selected. Hence, instead of using wait command, you can directly access the "Position" parameter of your drawfreehand object (i.e, h).
position = h.Position;
Try the above line in place of "position = wait(h)".
For more information, refer to the "Output Arguments" section in the drawfreehand documentation.

Sign in to comment.

More Answers (0)

Sign in to answer this question.

Products


Release

R2019a