Изрязване на елипса от изображение

Искам да извлека елипсовидна област от изображение (част от лицева част от изображение), за предпочитане в 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. Играйте с координатите на центъра и стойностите на радиусите, докато получите желания резултат.

РЕДАКТИРАНЕ: Разширих решението за RGB изображения (ако матрица A е 3-D).

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) * ( X - c(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