%Script align_Faces % % Aligns the eye positions of a directory of face images. Reads in Labels.mat, % obtained using getLabels.m, writes jpegs to a specified directory. % Specify directory paths at the top of the file. %LabelDir is where Labels.mat is. %imgDir is where the original images are %DestDir is where you want the cropped jpegs to go. LabelDir = 'C:\Users\Andrei\Desktop\yalefaces\' imgDir = 'C:\Users\Andrei\Desktop\yalefaces\normal\' DestDir = 'C:\Users\Andrei\Desktop\yalefaces\' homeDir = pwd; % CHANGE THESE VARIABLES AS NEEDED %XSIZE = YSIZE = %Size of desired cropped image %EYES = %Number of pixels desired between the eyes %TEETH_EYES = %Desired no. of pixels from teeth to eyes. XSIZE = 300; YSIZE = 150; EYES = 50; TEETH_EYES = 80; %SEE ALSO PARAMETERS IN CROP ROUTINE. EYES BELOW MIDPOINT. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Here is where we load the images and do the preprocessing %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% cd (LabelDir) load Labels cd (imgDir) r = dir; for i = 3:(size(r,1)) imgName = r(i).name %[X,map] = imread([ t ]); I=imread(imgName); %I=rgb2gray(I); %Extract face measurements: %dxeyes = x distance between eyes in original image % Average the locations of inner & outer corners. %dyeyes = y distance between eyes in original image %dEeyes = Euclidean norm distance between eyes %dEteeth_eyes = Euclidean norm distance from teeth to midpt b/neyes [height, width] = size(I); dxeyes = marks(i-2,3) - marks(i-2,1); %Check these. dyeyes = marks (i-2,4) - marks(i-2,2); dEeyes = sqrt(dxeyes^2 + dyeyes^2); mean_eye_x = mean([marks(i-2,1), marks(i-2,3)]); mean_eye_y = mean([marks(i-2,2), marks(i-2,4)]); dEteeth_eyes = sqrt((marks(i-2,5)-mean_eye_x)^2 + (marks(i-2,6)-mean_eye_y)^2); %scale yscale = TEETH_EYES / dEteeth_eyes; xscale = EYES / dEeyes; height_new = yscale*height; width_new = xscale*width; tmp0=imresize(I,[height_new,width_new],'bicubic'); %rotate (Problem: imrotate rotates about the center of the image. %To avoid losing feature position information, must first center the %image on the right eye before rotating. %Then use right eye position to determine cropping. Reye_x = marks(i-2,1); Reye_y = marks(i-2,2); %crop a 200x200 window centered on left eye: %Zero-pad to make sure window never falls outside of image. W = 100; %Window radius %W = 500; %For bigger images (Gwen's params). padcols = zeros(size(tmp0,1),W); padrows = zeros(W,size(tmp0,2)+W); padcols = uint8(padcols); padrows=uint8(padrows); tmp = [padrows;padcols,tmp0]; tmpx = xscale*Reye_x - W +W; tmpy = yscale*Reye_y - W +W; tmp1 = imcrop(tmp,[tmpx,tmpy,2*W,2*W]); %figure(2);imshow(tmp1) angle = 180/pi*atan((yscale*dyeyes)/(xscale*dxeyes)); tmp2 = imrotate(tmp1,angle,'bicubic','crop'); %figure(2); imshow(tmp2); %crop % x and y give the upper left corner of cropped image % Reye is centered at (W,W) = (100,100). % For bigger images (W,W) = (500,500) x = W - (XSIZE-EYES)/2; %y = W - YSIZE/2; %Eyes at midpoint y = W - YSIZE*1/3; %Face box tmp3=imcrop(tmp2,[x,y,XSIZE,YSIZE]); figure(1); imshow(tmp3); %save [imgName, R] = strtok(imgName, '.'); fname = [DestDir,imgName, '.pgm']; imwrite(tmp3,fname,'pgm') end