6

tôi muốn trích xuất một khu vực hình elip từ một hình ảnh (một phần của một phần khuôn mặt từ một hình ảnh) tốt nhất trong MATLAB:Cắt một hình elip từ một hình ảnh

enter image description here

Ví dụ, trong hình ảnh này, Tôi muốn trích xuất vùng trong ranh giới màu đỏ.
Có ai có thể giúp tôi với điều này không?

+0

Vui lòng xây dựng, đưa ra ví dụ, hiển thị hình ảnh, v.v ... –

+0

Bạn có muốn tìm khuôn mặt thủ công hoặc tự động không? –

+0

Hình elip được đưa ra như thế nào? Được chèn vào bằng cách sử dụng 'imellipse'? Bạn có biết hình học của nó (vị trí + trục chính và trục phụ) không? Bạn có thể sử dụng phương thức 'createMask' trên đối tượng' imellipse' kết quả. –

Trả lời

11

Cắt dễ dàng, tất cả những gì bạn phải làm là áp dụng mặt nạ thích hợp. Bí quyết là tạo ra một mặt nạ như vậy.

Giả sử A là hình ảnh của bạn, hãy thử này:

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

Ảnh bị cắt sẽ được lưu trữ trong A_cropped. Chơi với các tọa độ của trung tâm và các giá trị của bán kính cho đến khi bạn nhận được kết quả mong muốn.

EDIT: Tôi đã mở rộng giải pháp cho hình ảnh RGB (nếu ma trận A là 3-D).

+0

Tôi đã thử mã của bạn. Nó cho lỗi với dòng cuối cùng: A_cropped (ellipse_mask) = A; ??? Trong bài tập A (:) = B, số phần tử trong A và B phải giống nhau. – user671805

+0

Bạn nói đúng. Tôi sửa nó rồi. –

+0

Mã của bạn hoạt động ngay bây giờ. Nhưng bây giờ tôi chỉ có một hình elip màu đỏ hoàn toàn mờ đục với một nền đen. – user671805

2

Phương pháp này tôi sử dụng để cắt khuôn mặt thành hình elip. Nó làm cho nền trong suốt.

[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); 
Các vấn đề liên quan