function img = reverse(acc, img_size, thr)

% reverse
%
% A partir do resultado da transformada de Hough, constrói uma
% imagem contendo as linhas retas correspondentes aos picos da
% matriz de acumuladores.
%
% Recebe como entrada a matriz de acumuladores acc representando a
% votação feita no espaço de parâmetros rho e theta, um vetor
% img_size = [x y] onde x é o número de linhas da imagem de saída e
% y o número de colunas da imagem de saída, e um limiar thr usado
% para isolar os picos na matriz de acumuladores.
%
% Devolve a imagem com as linhas retas correspondentes a cada pico.

% A imagem gerada será de tamanho MxN pixels
M = img_size(1);
N = img_size(2);

img = zeros(M, N);

% Tamanho da matriz de acumuladores
Nrho = size(acc, 1);
Ntheta = size(acc, 2);

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

% Índice do pixel central da imagem de saída
center = floor([M + 1, N + 1] / 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);

% Valor mínimo de rho
rhmin = -diag_len / 2;

% Threshold do espaço de parâmetros (pega os picos mais altos)
[lin col] = find(acc > thr);
peaks = [lin col];

% Para cada pico, desenha a reta correspondente na imagem de saída
for i=1:size(peaks, 1)
  
  ith = peaks(i, 1);
  irh = peaks(i, 2);
  theta = (ith - 1) * deltaTheta;
  rho = (irh - 1) * deltaRho + rhmin;
  
  if (pi / 4 <= theta & theta <= 3 * pi / 4)
    for x=1:N
      y = floor((rho - (x - center(2)) * cos(theta)) / sin(theta) + 0.5) + center(1);
      if (y > 0 & y <= M)
        img(y, x) = 1;
      end
    end
  else
    for y=1:M
      x = floor((rho - (y - center(1)) * sin(theta)) / cos(theta) + 0.5) + center(2);
      if (x > 0 & x <= N)
        img(y, x) = 1;
      end
    end
  end
    
end
