6
Bir görüntü (resim bir yüz kısmının bir kısmını) eliptik bir bölge çıkarmak isteyen

bir elips Kırpma Bu resimde, örneğintercihen MATLAB bir görüntü

enter image description here

, Bölgeyi kırmızı sınır içinde çıkarmak istiyorum.
Bu konuda bana yardımcı olan var mı?

+0

hakkında detaylı bilgi veriniz vs örnekler, gösteri görüntüsünü vermek ... –

+0

elle veya otomatik olarak yüzü bulmak istiyor musunuz? –

+0

Elips nasıl verilir? Imellipse kullanılarak yerleştirilir mi? Bunun geometrisini biliyor musunuz (location + major ve minor axis)? Oluşan 'imellipse' nesnesinde' createMask' yöntemini kullanabilirsiniz. –

cevap

11

Kırpma kolaydır, yapmanız gereken tek şey uygun bir maske uygulamaktır. Hile böyle bir maske oluşturmaktır.

A varsayarsak, görüntünüzün, şunu deneyin:

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

kırpılmış görüntü A_cropped saklanacaktır. İstediğiniz sonucu elde edene kadar merkezin koordinatları ve yarıçap değerleriyle oynayın.

EDIT: RGB görüntülerin çözümünü uzattım (A matrisinin 3-D olması durumunda).

+0

Kodunuzu denedim. Son satırda hata verir: A_cropped (ellipse_mask) = A; ??? A (:) = B ödevinde A ve B öğelerinin sayısı aynı olmalıdır. – user671805

+0

Haklısınız. Onardım. –

+0

Kodunuz şimdi çalışıyor. Ama şimdi sadece siyah bir arka plan ile tamamen opak kırmızı bir elips olsun. – user671805

2

Bu, yüzleri elips şekline kırmak için kullandığım yöntemdir. Arkaplanı şeffaf hale getirir.

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