6

Quiero extraer una región elíptica de una imagen (una porción de una parte de cara de una imagen), preferiblemente en MATLAB:Recorte de una elipse de una imagen

enter image description here

Por ejemplo, en esta imagen, Quiero extraer la región dentro del límite rojo.
¿Alguien puede ayudarme con esto?

+0

favor elaborar, dar ejemplos, demostración de la imagen, etc ... –

+0

¿Quieres encontrar la cara de forma manual o automática? –

+0

¿Cómo se administra la elipse? ¿Se inserta usando 'imellipse'? ¿Sabrías la geometría del mismo (ubicación + eje mayor y eje menor)? Podría usar el método 'createMask' en el objeto' imellipse' resultante. –

Respuesta

11

Recortar es fácil, todo lo que tiene que hacer es aplicar una máscara adecuada. El truco es crear esa máscara.

Suponiendo A es su imagen, intente esto:

%# 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)); 

La imagen recortada se almacena en A_cropped. Juega con las coordenadas del centro y los valores de los radios hasta obtener el resultado deseado.

EDIT: amplié la solución para imágenes RGB (si la matriz A es 3-D).

+0

Probé tu código. Da error con la última línea: A_cropped (ellipse_mask) = A; ??? En una tarea A (:) = B, el número de elementos en A y B debe ser el mismo. – user671805

+0

Tienes razón. Lo arreglé. –

+0

Tu código funciona ahora. Pero ahora solo tengo una elipse roja completamente opaca con fondo negro. – user671805

2

Este es el método que uso para recortar caras en forma de elipse. Hace que el fondo sea transparente.

[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); 
Cuestiones relacionadas