function Acc2 = backhough(img, Ntheta, Nrho)

% backhough
%
% Executa a transformada de Hough com backmapping 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 Acc2.

% transformada de Hough sem backmapping
Acc = normalhough(img, Ntheta, Nrho);

img = double(img);

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

% Dimensões da imagem de entrada
[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);

% 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];

% Backmapping
for i=1:size(foreground,1)

  % A origem deve estar no centro da imagem
  point = foreground(i, :) - center;
  
  max = -10000;

  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
      if (Acc(ith, irh) > max)
        max = Acc(ith, irh);
        ith_max = ith;
        irh_max = irh;
      end
    end
    
  end

  if (max ~= -10000)
    Acc2(ith_max, irh_max) = Acc2(ith_max, irh_max) + img(foreground(i, 1), foreground(i, 2));
  end
  
end

