% Hough Transform for circles.
% img : logical image, zeros are the circles edges
% radius_range is a vector : [min, max]
function [acc_votes, acc_radius] = HTCircle(img, radius_range)

    [rows, columns] = size(img);
    
    acc_votes = zeros(rows, columns);
    acc_radius = zeros(rows, columns);
    
    phi_range = linspace(0, 2 * pi, 100);
    phi_range(end) = [];
    
    indexes_non_zero = find(img)';
    s = size(img);
    
    for r = radius_range(1):radius_range(2)
        acc = zeros(rows, columns);
        for i = indexes_non_zero
            [y, x] = ind2sub(s, i);            
            for phi = phi_range
                x0 = round(x - r * cos(phi));
                y0 = round(y - r * sin(phi));
                if x0 < columns && x0 > 0 && y0 < rows && y0 > 0
                    acc(y0, x0) = acc(y0, x0) + 1;
                end
            end
        end
        
        for x = 1:columns
            for y = 1:rows
                if acc(y, x) > acc_votes(y, x)
                    acc_votes(y, x) = acc(y, x);
                    acc_radius(y, x) = r;
                end
            end
        end        
    end
    
    acc_votes = imgaussfilt(acc_votes, 1.0);
end

