Creating a bounding box that is not a perfect rectangle
4 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
ISABELLE GUNDRUM
le 14 Jan 2023
Réponse apportée : Image Analyst
le 14 Jan 2023
Currently, my code allows me to select a ROI in an image and then it creates a bounding box. This bounding box, however, is a rectangle while I would like the cropped image to remain as the ROI shape and not a perfect rectangle.
clear varaiables, close all
if ~exist("image_analysis.mlx")
% 1. Load the file and scale it
before = "blue_close"; white = "white_close"; after = "group1_close";
A = imresize(imread(before,'jpg'),1.00);
B = imresize(imread(white,'jpg'),1.00);
C = imresize(imread(after,'jpg'),1.00);
% % 2. manually specify the ROI using the original image
imshow(A)
h = drawpolygon('FaceAlpha',0);
h.Color = 'yellow';
% find a bounding box of ROI to further cut the image smaller
% bbox = [xmin ymin xmax ymax]
hmin = min(h.Position); hmax = max(h.Position);
bbox = [hmin hmax-hmin];
% 3. Crop ROI for both image a and image b using the bounding box
Cb = imcrop(B,bbox);
Ca = imcrop(A,bbox);
Cc = imcrop(C,bbox);
clear A B C
save sqa.mat
else
load sqa.mat
end
Thanks!
4 commentaires
Walter Roberson
le 14 Jan 2023
For example if you were to create a mask from the ROI, and you were to double() that so that the values become numeric 0 and numeric 1 instead of logical 0 (false) and logical 1 (true), then you could pass that numeric array to regionprops as the "label" array, and pass in a grayscale image as the next parameter. You can then ask about the properties and it will only calculate the properties for the marked locations.
That said... if you were calculating a property such as Solidity which has to do with the area occupied relative the area of the bounding box, then the bounding box is still going to be calculated as a rectangle.
Réponse acceptée
DGM
le 14 Jan 2023
As Matt says, it depends what you intend to do with the image region. If all you intend to do is some sort of color analysis, then:
% a test image
inpict = imread('peppers.png');
% create ROI object
% i'm explicitly setting the point list since i'm doing this in the forum
imshow(inpict)
ROI = drawpolygon(gca,'position',[295 184;256 207;281 217;298 222;304 193]);
% create mask from the ROI, expand as necessary
mask = repmat(createMask(ROI),[1 1 size(inpict,3)]);
% get samples from selected locations
% this is a Mx3 array of RGB values
sampledpixels = reshape(inpict(mask),[],3)
Of course, this won't be of much help if you're trying to do anything spatial.
0 commentaires
Plus de réponses (1)
Voir également
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!