Randomly position an ellipse and create a cutout

2 views (last 30 days)
Claire Moad
Claire Moad on 20 Feb 2024
Edited: DGM on 20 Feb 2024
I am attempting to randomly position ellipses onto an image and create cut outs from them (the end goal is to create multiple ellipse cutouts from the image). I have previously found imellipse - however my code is getting stuck whilst waiting for the position I think (orignally from a previous Ask https://au.mathworks.com/matlabcentral/answers/335146-how-can-i-automatically-crop-an-image-in-an-elliptical-shape )
I=imread('background.png');
h = imshow(I) ;
%%call imellipse
% set some positon for ellipse
x = 100;
y = 150;
d1 = 10;
d2 = 100;
e = imellipse(gca, [x y d1 d2]);
% wait to change the positon
position = wait(e);
% update the positon
pos = getPosition(e);
x = pos(1);
y = pos(2);
d1 = pos(3);
d2 = pos(4);
%
BW = createMask(e,h);
% here assuming your image is uint8
BW = uint8(BW);
I2 = I.*BW; % everything outside circle to black
imwrite(I2,'oval_cropped.png','Transparency',0);
I also found from searching Random2d which allows me to randomly position a rectangle onto the image as well as use it to create crops ( https://au.mathworks.com/help/images/ref/randomwindow2d.html )
I = imread("background.png");
imshow(I)
inputSize = size(I);
targetSize = [40 60];
rect = randomWindow2d(inputSize,targetSize);
rectXYWH = [rect.XLimits(1) rect.YLimits(1) ...
diff(rect.XLimits)+1 diff(rect.YLimits)+1];
annotatedI = insertShape(I,"rectangle",rectXYWH,"LineWidth",3);
imshow(annotatedI)

Answers (1)

DGM
DGM on 20 Feb 2024
Edited: DGM on 20 Feb 2024
Depending on what you mean by "crop", this may suffice:
That uses a joke tool to create a mask containing arbitrarily positioned/rotated ellipses (and other shapes), and it doesn't require figure thrashing or manual user interaction.
If you're after something else, you'll need to elaborate.

Products


Release

R2023a

Community Treasure Hunt

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

Start Hunting!