Voici ce que j'ai jusqu'à présent. La façon dont je remplis mon espace Hough est loin d'être optimale. Je suis sûr que je peux faire de la vectorisation pour l'accélérer. J'utilise Matlab R2011a. Image originale
Les suggestions sont appréciées, merci.
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)
J'ai modifié une fonction de ligne de dessin que j'ai trouvée sur matlab central pour incrémenter d'un pixel d'une valeur au lieu de définir un pixel sur une valeur
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