Вырезание эллипса из изображения

Я хочу извлечь эллиптическую область из изображения (часть лица из изображения) предпочтительно в MATLAB:

введите здесь описание изображения

Например, на этом изображении я хочу выделить область с красной рамкой.
Может ли кто-нибудь помочь мне с этим?


person user671805    schedule 18.06.2012    source источник
comment
Пожалуйста, уточните, приведите примеры, покажите изображение и т. д.   -  person Andrey Rubshtein    schedule 18.06.2012
comment
Вы хотите найти лицо вручную или автоматически?   -  person Andrey Rubshtein    schedule 18.06.2012
comment
Как дан эллипс? Вставляется ли с помощью imellipse? Знаете ли вы его геометрию (местоположение + большая и малая ось)? Вы можете использовать метод createMask для результирующего объекта imellipse.   -  person Ole Thomsen Buus    schedule 18.06.2012


Ответы (2)


Обрезать легко, все, что вам нужно сделать, это применить правильную маску. Хитрость заключается в создании такой маски.

Предполагая, что A — это ваше изображение, попробуйте следующее:

%# Create an ellipse shaped mask
c = fix(size(A) / 2);   %# Ellipse center point (y, x)
r_sq = [76, 100] .^ 2;  %# Ellipse radii squared (y-axis, x-axis)
[X, Y] = meshgrid(1:size(A, 2), 1:size(A, 1));
ellipse_mask = (r_sq(2) * (X - c(2)) .^ 2 + ...
    r_sq(1) * (Y - c(1)) .^ 2 <= prod(r_sq));

%# Apply the mask to the image
A_cropped = bsxfun(@times, A, uint8(ellipse_mask));

Обрезанное изображение будет сохранено в A_cropped. Играйте с координатами центра и значениями радиусов, пока не получите желаемый результат.

EDIT: я расширил решение для изображений RGB (если матрица A является трехмерной).

person Eitan T    schedule 18.06.2012
comment
Я попробовал ваш код. Выдает ошибку с последней строкой: A_cropped(ellipse_mask) = A; ??? В присваивании A(:) = B количество элементов в A и B должно быть одинаковым. - person user671805; 18.06.2012
comment
Ваш код работает сейчас. Но сейчас у меня просто получается совершенно непрозрачный красный эллипс с черным фоном. - person user671805; 18.06.2012
comment
Исходное изображение нормально отображается с imshow(A)? imagesc у меня отлично работает и правильно показывает обрезанное лицо. - person Eitan T; 18.06.2012
comment
давайте продолжим это обсуждение в чате - person user671805; 18.06.2012
comment
Обратите внимание, что если маску нельзя использовать повторно (например, потому что на изображении есть только один эллипс), вы можете сэкономить время и память, не сохраняя ее явно и обрезая на месте: A(~(r_sq(2) * ( Х - с(2) и т.д. и т.п.)) = 0; - person Francesco Callari; 18.06.2012
comment
Можем ли мы сделать то же самое с функцией imellipse? Если мы делаем как? - person user951487; 17.07.2014

Этот метод я использую, чтобы обрезать лица в форме эллипса. Делает фон прозрачным.

[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);
person Michael James Kali Galarnyk    schedule 24.10.2015