function Isal = ecualiza(Ient)
%ECUALIZA Mejora la apariencia visual de la imagen ecualizando el histog. 
%   Isal = ecualiza(Ient)

%______________________________________________________________________%
% NOMBRE DEL FICHERO:   ecualiza.m                                     %                                              
% RECIBE: Imagen en niveles de gris                                    %
% DEVUELVE: Una imagen en niveles de gris pero ecualizada,es decir     %
%           con una distribucion uniforme en los niveles de gris       %
% ALGORITMO EMPLEADO: Ecualización histograma. Algoritmo 2.2. pág.34   %
% VARIABLES:   Ient = imagen introducida                               %
%              Isal = imagen resultante                                %
%              filas = numero de filas de Ient                         %
%              columnas = numero de columnas de Ient                   %
%              histo = vector que representa el histograma             %
%              total_pixels = numero de pixeles de la imagen           %
%              k = variable contador para recorrer niv.de gris histog  %
%              probabilidad = vector fila  contiene la probabilidad de %
%                             que se presente  cada uno de los niveles %
%                             de gris                                  %
%              acumulada = vector fila representa la prob. acumulada   % 
%              ecualizador= vector  fila  contiene el valor  del nuevo %
%                           nivel de gris de cada pixel                %  
% BUGS:                                                                %
% COMENTARIO : La ecualización del histograma mejora la apariciencia   %
% visual de la imagen haciendo una redistribucion de los niveles de    %
% gris. No obstante, este tipo de procesamiento no hace nada mas       %
% que eso: mejorar la apariencia. De cara al tratamiento automatica    %
% de la imagen no aporta nada                                          %
% LIBRO: VISION ARTIFICIAL INDUSTRIAL. UNIVERSIDAD DE VALLADOLID 2012  %
% TEMA 2 LA IMAGEN DIGITAL  pág.34 Algoritmo 2.2                       %
% AUTORES: Eusebio de la Fuente y Félix Miguel Trespaderne             %
%______________________________________________________________________%
%  Ejemplo de ejecucion:                                               %
%----------------------------------------------------------------------%
% >> I=imread('fig2_09a.bmp');                                         %
% >> E = ecualiza(I);                                                  % 
%______________________________________________________________________%
% Con funciones de matlab
% >> J = histeq(I);
% >> figure, imshow(I), figure, imshow(J)
%______________________________________________________________________%

% Devuelve el nº de filas y columnas en  variables de salida separadas 
[filas,columnas] = size(Ient);

Isal = zeros(filas,columnas);
histo = zeros(1,256);

% Calculo del histograma 
histo=imhist(Ient);

% Convierte la variable Ient en una variable de doble precision  
Ient = double (Ient);

% Calculo del numero de pixels de la imagen 
total_pixels = filas * columnas;

% Asignacion de  un vector fila de  255 elementos  todos ellos nulos a 
% la variable probabilidad                                             
probabilidad = zeros (1,256);

% Calcula la probabilidad de que se  presenten cada uno de los niveles 
% de gris                                                              
for k=1:256
    probabilidad(k)=histo(k)/total_pixels;
end

% Asignacion de  un vector fila de 255  elementos  todos ellos nulos a 
% la variable acumulada                                                
acumulada = zeros(1,256);

% La probabilidad acumulada que tiene el pixel 0 es la probabilidad de 0                                                        
acumulada(1) = probabilidad(1);

% Calculo de la acumulada(k) como la suma de la acumulada anterior mas %
% la probabilidad de nivel de gris que existe en k. No empieza en 1 ya %
% que la acumulada del primer pixel es igual a la probabilida de este  %
for k = 2:256
    acumulada(k) = acumulada(k-1) + probabilidad(k);
end

% Ecualizador va a contener la transformacion del nivel de gris        %
ecualizador= zeros(1,256);

for k=1:256
    ecualizador(k) = acumulada(k)*256;
end

%Sustitucion de los niveles de gris en base a ecualizador
for i=1:filas
    for j=1:columnas
        k = Ient(i,j);
        Isal(i,j)=ecualizador(k+1);
    end
end

Ient = uint8(Ient);
Isal = uint8(Isal);

%Representacion Grafica
subplot(2,2,1);imshow(Ient);title('Imagen Original');
subplot(2,2,2);imhist(Ient);title('Histo.Im.Orig');
subplot(2,2,3);imshow(Isal);title('Imagen Ecualiz.');
subplot(2,2,4);imhist(Isal);title('Histo.Im.Ecualiz.');
