function tabla = hough( I )
%HOUGH Transformada de Hough
%   Calcula la tabla de acumulación de la transformada de Hough        %
%   empleando resolucion 1 para rho y para tita                        %
%   Optimizada empleando la dirección del gradiente.Solo vota en +-20º %
%                                                                      %
% RECIBE: Imagen de nivel de gris                                      %
% DEVUELVE:  Tabla de acumulación                                      %
% ALGORITMO EMPLEADO: Transformada de Hough optimizada x ang. grad.    %
% VARIABLES:   I = imagen nivel de gris                                %
%              tabla = tabla de acumulación de Hough                   %
%              rho = distancia del origen de coord a la recta a lo     %
%                   largo del vector perpendicular a la linea          %
%              tita = angulo entre eje horizontal X y ese vector       %
%              umbral_hough = numero minimo de votos en casilla tabla  %
%              filas = numero de filas de la imagen I                  %
%              columnas = numero de columnas de la imagen I            %
%              C = imagen de contornos                                 %
%              Ix =imagen derivada horizontal                          %
%              Iy =imagen derivada vertical                            %
%              modulo = imagen modulo del gradiente                    %
%              angulo = imagen argumento del gradiente                 %
% BUGS:                                                                %                                       
% SUPOSICIONES : Vota cada punto a lo largo de +-20º alrededor ang.grad%
%                 Eje X horizontal                                     %
%              Una acumulacion en la tabla en la posicion (rho,tita)   %
%              indicara que existe una recta que forma un ángulo con   %
%              la horizontal de tita-1-90 y la distancia al origen es  %
%              rho - 1                                                 %
% Ejemplo:
% >> H=hough(I);
% >> P=houghPicos(H,0.2);
% >> houghDibujaRectas(P,'r');

[filas,columnas]=size(I);

%--Crreo tabla de acumulacion a cero para resolucion rho 1 y tita 1
rho_maxima=sqrt(filas^2+columnas^2); %calcula la diagonal de la imagen
tabla=zeros(2*rho_maxima, 360); 

%-------- Filtrado con las mascaras de Sobel para obtener Ix e Iy--------%
%máscaras de Sobel
Sx=[-1, 0, 1 ;
    -2, 0, 2;
    -1, 0, 1];
Sy=	[-1,-2,-1;  
      0, 0, 0;  
      1, 2, 1];

I=double(I); %para que me haga el filtrado como double
Ix=imfilter(I,Sx);
Iy=imfilter(I,Sy);
angulo = atan2(double(Iy),double(Ix));

C = edge(I); %-----------------saca los contornos------------------------

for i=2:filas-1
    for j=2:columnas-1
        if (C(i,j))%solo miro en los puntos de contorno
            %------Voto solo en ang+-30º---------------
            angGrados=angulo(i,j)*180/pi;
            angInicio=angGrados-20;
            angFin = angGrados+20;
            for tita=angInicio:angFin
                angRad=tita*pi/180;
                rho = j*cos(angRad)+i*sin(angRad); 
                %Truncamos el valor de rho y le sumamos rho_maxima
                %ya que necesitamos indices enteros y positivos 
                r = floor(rho)+ 1 +rho_maxima; %sumo 1 para no acceder al 0
                t = mod(tita,360);%para grados negativos y >360
                t = floor(t) + 1; %trunco para tener indices enteros
                %Incremento contador tabla
                tabla(r , t) = tabla(r , t) + 1; 
            end
        end
    end
end

end

