% BALANCE

% balance an image

% must have run getbalance first

newImage = test_image;

lighting = 3;

method = 2;

filePath = 'C:\Documents and Settings\Kim Shultz\My Documents\ee362\balanced pictures\';

fileName = cat(2,filePath,test_image.jpg');

% lighting number as follows:

% 1 = sun

% 2 = shadow

% 3 = flourescent

% 4 = incandescent

% 5 = flash

 

%method for balancing as follows:

% 1 = linear subtract: subtract illuminant bias

%add/subtract to R, G and B to match mean value

% 2 = linear scale: scale R, G and B to match mean value by multiplying by

        % ratio

% 4 = grey world multiplicative - scale image's G and B means (by addition)

    % to match mean value

 

 

if method == 1

    Rav = mean(newImage(:,:,1));

    Rav = mean(Rav);

    Gav = mean(newImage(:,:,2));

    Gav = mean(Gav);

    Bav = mean(newImage(:,:,3));

    Bav = mean(Bav);

    targetav = mean([Rav Gav Bav]);

    scale = (1-balanceValues(:,lighting))*targetav;

    newImage(:,:,1) = newImage(:,:,1) + scale(1);

    newImage(:,:,2) = newImage(:,:,2) + scale(2);

    newImage(:,:,3) = newImage(:,:,3) + scale(3);

    newImage(:,:,3) = newImage(:,:,3)+Bscale;

    %if any values are over 1, cutoff at 1

    newImage = min(newImage,1);

    %if any values are under 0, cutoff at 0

    newImage = max(newImage,0);

end

 

if method == 2  

    newImage(:,:,1) = newImage(:,:,1)/balanceValues(1,lighting);

    newImage(:,:,2) = newImage(:,:,2)/balanceValues(2,lighting);

    newImage(:,:,3) = newImage(:,:,3)/balanceValues(3,lighting);

    %if any values are over 1, cutoff at 1

    newImage = min(newImage,1);

end

   

if method == 3

    Rav = mean(newImage(:,:,1));

    Rav = mean(Rav);

    Gav = mean(newImage(:,:,2));

    Gav = mean(Gav);

    Bav = mean(newImage(:,:,3));

    Bav = mean(Bav);

    targetav = mean([Rav Gav Bav]);

    newImage(:,:,1) = newImage(:,:,1)+(targetav-Rav);

    newImage(:,:,2) = newImage(:,:,2)+(targetav-Gav);

    newImage(:,:,3) = newImage(:,:,3)+(targetav-Bav);

    %if any values are over 1, cutoff at 1

    newImage = min(newImage,1);

    %if any values are under 0, cutoff at 0

    newImage = max(newImage,0);

end

 

if method == 4

    Rav = mean(newImage(:,:,1));

    Rav = mean(Rav);

    Gav = mean(newImage(:,:,2));

    Gav = mean(Gav);

    Bav = mean(newImage(:,:,3));

    Bav = mean(Bav);

    targetav = mean([Rav Gav Bav]);

    newImage(:,:,1) = newImage(:,:,1)*(targetav/Rav);

    newImage(:,:,2) = newImage(:,:,2)*(targetav/Gav);

    newImage(:,:,3) = newImage(:,:,3)*(targetav/Bav);

    %if any values are over 1, cutoff at 1

    newImage = min(newImage,1);

    %if any values are under 0, cutoff at 0

    newImage = max(newImage,0);

end

 

imwrite(newImage,fileName,'jpeg');