--- /dev/null
+% Hough Transform for circles.
+% x_dir : the x component of the normalized gradient
+% y_dir : the y component of the normalized gradient
+% edges : a binary image with edge = 1
+% radius_range is a vector : [min, max]
+function [acc_votes, acc_radius] = HTCircleMa(x_dir, y_dir, edges, radius_range)
+
+ [rows, columns] = size(edges);
+
+ acc_votes = zeros(rows, columns);
+ acc_radius = zeros(rows, columns);
+
+ indexes_edges = find(edges)';
+ s = size(edges);
+
+ for r = radius_range(1):radius_range(2)
+ acc = zeros(rows, columns);
+ for i = indexes_edges
+ [y, x] = ind2sub(s, i);
+
+ x0 = round(x + x_dir(i) * r);
+ y0 = round(y + y_dir(i) * r);
+
+ if x0 < columns && x0 > 0 && y0 < rows && y0 > 0
+ acc(y0, x0) = acc(y0, x0) + 1;
+ 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
+