6

मैं (एक छवि से एक चेहरा भाग का एक हिस्सा) एक छवि से एक अण्डाकार क्षेत्र निकालना चाहते हैं अधिमानतः MATLAB में से एक अंडाकार फसल:एक छवि

enter image description here

उदाहरण के लिए, इस छवि में, मैं इस क्षेत्र को लाल सीमा के भीतर निकालना चाहता हूं।
क्या कोई इस से मेरी सहायता कर सकता है?

+0

कृपया विस्तार से बताएं, उदाहरण, शो छवि, आदि देना ... –

+0

आप मैन्युअल रूप से या स्वचालित रूप से चेहरे को खोजने के लिए करना चाहते हैं? –

+0

अंडाकार कैसे दिया जाता है? 'Imellipse' का उपयोग करके डाला गया है? क्या आप इसकी ज्यामिति जान लेंगे (स्थान + प्रमुख और मामूली धुरी)? आप परिणामी 'imellipse' ऑब्जेक्ट पर' createMask' विधि का उपयोग कर सकते हैं। –

उत्तर

11

फसल आसान है, आपको बस एक उचित मुखौटा लागू करना है। चाल ऐसी मास्क बनाने के लिए है।

मान लिया जाये कि 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 में संग्रहीत किया जाएगा। वांछित परिणाम प्राप्त होने तक केंद्र के निर्देशांक और त्रिज्या के मानों के साथ खेलो।

संपादित करें: मैंने आरजीबी छवियों के लिए समाधान बढ़ाया (यदि मैट्रिक्स A 3-डी है)।

+0

मैंने आपके कोड की कोशिश की। यह अंतिम पंक्ति के साथ त्रुटि देता है: A_cropped (ellipse_mask) = ए; ??? असाइनमेंट ए (:) = बी में, ए और बी में तत्वों की संख्या समान होनी चाहिए। – user671805

+0

आप सही हैं। मैंने ठीक कर दिया। –

+0

आपका कोड अब काम करता है। लेकिन अब मुझे एक काले रंग की पृष्ठभूमि के साथ पूरी तरह से अपारदर्शी लाल अंडाकार मिलता है। – user671805

2

इस विधि का उपयोग मैं चेहरे को अंडाकार आकार में फसल करने के लिए उपयोग करता हूं। यह पृष्ठभूमि पारदर्शी बनाता है।

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