function BW = Binauto(Ient)
%BINAUTO Genera la imagen binaria BW a partir de img. niveles gris Ient
%   BW = Binauto(Ient)
%   Busca automáticamente el umbral óptimo para la binarización
%   Pone a 1 todos los píxeles que tengan un valor mayor que umbral en I
%   Pone a 0 (negro) todos los pixeles por debajo de este umbral
%   BW es de tipo logical. Solo dos niveles 0 o 1
%   Funciona bien en imágenes con histograma bimodal
%   Emplea el algoritmo de Otsu 

%______________________________________________________________________%
%                                                                      %
% NOMBRE DEL FICHERO:   BW = Binauto (Ient)                            %
%                                                                      %
% RECIBE: Imagen en blanco y negro con histo bimodal, es decir, con    %
%         dos poblaciones de niv.de gris claramente diferenciadas      %
% DEVUELVE: La misma imagen pero binarizada,calcula el umbral a traves %
%           de la minimizacion de la suma de las varianzas de los  dos %
%           grupos en que se ha dividido la imagen. Una vez determinado%
%           el umbral idóneo llama a la funcion binarizarimagen        %
% ALGORITMO EMPLEADO: Minimizacion de la suma de las varianzas de las  %
%                     poblaciones que origina el umbral                %
% VARIABLES:   Ient = imagen introducida                               %
%              BW = imagen resultante                                  %
%              filas = numero de filas de la imagen Ient               %
%              columnas = numero de columnas de la imagen Ient         %
%              i = variable contador para recorrer las filas de la img.% 
%              j = variable contador para recorrer las columnas        %
% BUGS: En imágenes con histograma no bimodal puede generar umbrales   %
%       no idóneos                                                     %
% SUPOSICIONES : Se supone una imagen con histograma bimodal           %
% LIBRO: VISION ARTIFICIAL INDUSTRIAL. UNIVERSIDAD DE VALLADOLID 2012  %   
% TEMA 4 IMAGENES BINARIAS. pág 65. Algoritmo 4.2                      %
% AUTORES: Eusebio de la Fuente y Félix Miguel Trespaderne             %
%______________________________________________________________________%
%  Ejemplo de ejecucion:                                               %
%----------------------------------------------------------------------%
%                                                                      %
% >> Ient = imread('corona1.bmp');                                     %
% >> BW= binauto(Ient);                                                %
% >> imshow(BW);                                                       %
%______________________________________________________________________%
% Con funciones de matlab
% >> I = imread('corona1.bmp');                                        %
% >> umbralOpt=graythresh(I);
% >> BW = im2bw(I,umbralOpt); 
%______________________________________________________________________%


% Asignacion de  un vector fila de  255 elementos  todos ellos nulos a %
% la variable suma_var que va almacenar  posteriormente la suma de las %
% varianzas para todos los umbrales posibles (1-256)                   %
suma_var = zeros(1,256);

% Llamada a la funcion histograma                                      %
histo = imhist(Ient);


for t = 1:256      % se hace el cálculo para todos los niveles de gris %

    suma1 = 0;                     %suma del nivel de gris del grupo 1 %
    n1 = 0;                           %número de pixeles en el grupo 1 %
    suma_cuad1 = 0;           %sumatorio (pixel-media)^2 en el grupo 1 %
    varianza1 = 0;                               %varianza del grupo 1 %

    suma2 = 0;                         %suma nivel de gris del grupo 2 %
    n2 = 0;                           %número de pixeles en el grupo 2 %
    suma_cuad2 = 0;           %sumatorio (pixel-media)^2 en el grupo 2 %
    varianza2 = 0;                               %varianza del grupo 2 %

    % --------------------------Grupo 1--------------------------------%
    for k =1:t
        suma1 = suma1 + k*histo(k);
        n1 = n1 + histo(k);
    end
    if n1 > 0                       % para evitar la division por cero %
        media1 = suma1/n1;
        for k =1:t
            suma_cuad1 = suma_cuad1 + histo(k)*(k-media1)*(k-media1);
        end
        varianza1 = suma_cuad1/n1;
    end

    % ----------------------------Grupo 2----------------------------- %
    for k = t+1:256
        suma2 = suma2 + k*histo(k);
        n2 = n2 + histo(k);
    end
    if n2 > 0
        media2 = suma2/n2;

        for k = t+1:256
            suma_cuad2 = suma_cuad2 + histo(k)*(k-media2)*(k-media2);
        end
        varianza2 = suma_cuad2/n2;
    end

     
     % Calculo de la suma ponderada de las varianzas %       
     suma_var(t) = (n1/(n1+n2)) *varianza1 + (n2/(n1+n2))* varianza2;
end
   
% Busca el valor mínimo dentro del vector suma_var %
var_min = suma_var(1);
umbral=1;
for t = 2:256
   if suma_var(t) < var_min
      var_min = suma_var(t);
      umbral = t;
   end
end
umbral=umbral-1;     %los n.de g.empiezan en 0 no en 1 como nuestro vector
% Umbral calculado mediante la varianza %
disp('El umbral calculado es:');
umbral 

% Pasamos el umbral calculado a la funcion binariza %
BW=binariza(Ient,umbral); 
