У меня много изображений лиц, я хочу извлечь эллиптическую область из изображений вручную, обрезать и сохранить ее автоматически (например, imcrop, но не прямоугольник). Не могли бы вы помочь мне в этом?
Спасибо за вашу помощь
У меня много изображений лиц, я хочу извлечь эллиптическую область из изображений вручную, обрезать и сохранить ее автоматически (например, imcrop, но не прямоугольник). Не могли бы вы помочь мне в этом?
Спасибо за вашу помощь
Вы можете использовать функцию imellipse
.
%This is what you would do after creating the mask to get the coordinates.
structBoundaries = bwboundaries(binaryImage);
xy=structBoundaries{1}; % Get n by 2 array of x,y coordinates.
x = xy(:, 2); % Columns.
y = xy(:, 1); % Rows.
Однако лучшим способом было бы использовать приведенный ниже код. По сути, он просит пользователя выбрать изображение, а затем пользователь обрезает изображение вручную, а затем сохраняет его в место, где находится исходное изображение.
[FileName,PathName] = uigetfile({'*.jpg;*.tif;*.png;*.gif','All Image Files'},'Please Select an Image');
image = imread([PathName FileName]);
imshow(image) %needed to use imellipse
user_defined_ellipse = imellipse(gca, []); % creates user defined ellipse object.
wait(user_defined_ellipse);% You need to click twice to continue.
MASK = double(user_defined_ellipse.createMask());
new_image_name = [PathName 'Cropped_Image_' FileName];
new_image_name = new_image_name(1:strfind(new_image_name,'.')-1); %removing the .jpg, .tiff, etc
new_image_name = [new_image_name '.png']; % making the image .png so it can be transparent
imwrite(image, new_image_name,'png','Alpha',MASK);
msg = msgbox(['The image was written to ' new_image_name],'New Image Path');
waitfor(msg);