function Acc = normalhough(img, Ntheta, Nrho)

% normalhough
%
% Executa a transformada de Hough para linhas retas, usando a
% parametrização rho = x * cos(theta) + y * sin(theta).
%
% Recebe como entrada uma imagem e as dimensões da matriz de
% acumuladores (Ntheta x Nrho). Devolve a matriz de acumuladores Acc.

img = double(img);

% Imagem de entrada MxN
[M, N] = size(img);

% Índice do pixel central da imagem de entrada
center = floor([M + 1, N + 1] / 2);

% Comprimento da diagonal da imagem de entrada
diag_len = sqrt(M^2 + N^2);

% Matriz de acumuladores
Acc = zeros(Ntheta, Nrho);

% Valor mínimo de rho (distância normal)
rhmin = -diag_len / 2;

% Variações de theta e rho a cada linha e coluna da matriz de acumuladores
deltaTheta = pi / (Ntheta - 1);
deltaRho = diag_len / (Nrho - 1);

% Encontra os pixels da imagem que não pertencem ao fundo
[lin col] = find(img);
foreground = [lin col];

% Para cada pixel do foreground, mapeia suas coordenadas para o
% espaço de parâmetros rho e theta, realizando a votação nos
% acumuladores apropriados. O nível de cinza do pixel na imagem é
% adicionado ao acumulador
for i=1:size(foreground, 1)
  
  % A origem deve estar no centro da imagem
  point = foreground(i, :) - center;

  for ith=1:Ntheta - 1
    
    th = (ith - 1) * deltaTheta;
    rh_ini = point(2) * cos(th) + point(1) * sin(th) - mi(th) / 2;
    rh_fin = rh_ini + mi(th);
    irh_ini = ceil((rh_ini - rhmin) / deltaRho + 1);
    irh_fin = ceil((rh_fin - rhmin) / deltaRho);
    
    for irh=irh_ini:irh_fin
      Acc(ith, irh) = Acc(ith, irh) + img(foreground(i, 1), foreground(i, 2));
    end
    
  end
  
end