Esto es lo que tengo hasta ahora. La forma en que estoy poblando mi espacio Hough está lejos de ser óptima. Estoy bastante seguro de que hay algo de vectorización que puedo hacer para hacerlo más rápido. Estoy usando Matlab R2011a. Imagen original
Se agradecen las sugerencias, gracias.
clear all; clc; close all;
%% read in image and find gradient information
img = rgb2gray(imread('123.png'));
[rows, columns] = size(img);
[dx, dy] = gradient(double(img));
[x y] = meshgrid(1:columns, 1:rows);
u = dx;
v = dy;
imshow(img);
hold on
quiver(x, y, u, v)
%% create Hough space and populate
hough_space = zeros(size(img));
for i = 1:columns
for j = 1:rows
X1 = i;
Y1 = j;
X2 = round(i + dx(j,i));
Y2 = round(j + dy(j,i));
increment = 1;
slope = (Y2 - Y1) / (X2 - X1);
y_intercept = Y1 - slope * X1;
X3 = X1 + 5;
if X3 < columns && X3 > 1
Y3 = slope * X3 + y_intercept;
if Y3 < rows && Y3 > 1
hough_space = func_Drawline(hough_space, Y1, X1, floor(Y3), floor(X3), increment);
end
end
end
end
imtool(hough_space)
Modifiqué una función de línea de dibujo que encontré en matlab central para aumentar un píxel por un valor en lugar de establecer un píxel en un valor
function Img = func_DrawLine(Img, X0, Y0, X1, Y1, nG)
% Connect two pixels in an image with the desired graylevel
%
% Command line
% ------------
% result = func_DrawLine(Img, X1, Y1, X2, Y2)
% input: Img : the original image.
% (X1, Y1), (X2, Y2) : points to connect.
% nG : the gray level of the line.
% output: result
%
% Note
% ----
% Img can be anything
% (X1, Y1), (X2, Y2) should be NOT be OUT of the Img
%
% The computation cost of this program is around half as Cubas's [1]
% [1] As for Cubas's code, please refer
% http://www.mathworks.com/matlabcentral/fileexchange/loadFile.do?objectId=4177
%
% Example
% -------
% result = func_DrawLine(zeros(5, 10), 2, 1, 5, 10, 1)
% result =
% 0 0 0 0 0 0 0 0 0 0
% 1 1 1 0 0 0 0 0 0 0
% 0 0 0 1 1 1 0 0 0 0
% 0 0 0 0 0 0 1 1 1 0
% 0 0 0 0 0 0 0 0 0 1
%
%
% Jing Tian Oct. 31 2000
% scuteejtian@hotmail.com
% This program is written in Oct.2000 during my postgraduate in
% GuangZhou, P. R. China.
% Version 1.0
Img(X0, Y0) = Img(X0, Y0) + nG;
Img(X1, Y1) = Img(X1, Y1) + nG;
if abs(X1 - X0) <= abs(Y1 - Y0)
if Y1 < Y0
k = X1; X1 = X0; X0 = k;
k = Y1; Y1 = Y0; Y0 = k;
end
if (X1 >= X0) & (Y1 >= Y0)
dy = Y1-Y0; dx = X1-X0;
p = 2*dx; n = 2*dy - 2*dx; tn = dy;
while (Y0 < Y1)
if tn >= 0
tn = tn - p;
else
tn = tn + n; X0 = X0 + 1;
end
Y0 = Y0 + 1; Img(X0, Y0) = Img(X0, Y0) + nG;
end
else
dy = Y1 - Y0; dx = X1 - X0;
p = -2*dx; n = 2*dy + 2*dx; tn = dy;
while (Y0 <= Y1)
if tn >= 0
tn = tn - p;
else
tn = tn + n; X0 = X0 - 1;
end
Y0 = Y0 + 1; Img(X0, Y0) = Img(X0, Y0) + nG;
end
end
else if X1 < X0
k = X1; X1 = X0; X0 = k;
k = Y1; Y1 = Y0; Y0 = k;
end
if (X1 >= X0) & (Y1 >= Y0)
dy = Y1 - Y0; dx = X1 - X0;
p = 2*dy; n = 2*dx-2*dy; tn = dx;
while (X0 < X1)
if tn >= 0
tn = tn - p;
else
tn = tn + n; Y0 = Y0 + 1;
end
X0 = X0 + 1; Img(X0, Y0) = Img(X0, Y0) + nG;
end
else
dy = Y1 - Y0; dx = X1 - X0;
p = -2*dy; n = 2*dy + 2*dx; tn = dx;
while (X0 < X1)
if tn >= 0
tn = tn - p;
else
tn = tn + n; Y0 = Y0 - 1;
end
X0 = X0 + 1; Img(X0, Y0) = Img(X0, Y0) + nG;
end
end
end