Ecco quello che ho finora. Il modo in cui sto popolando il mio spazio Hough è tutt'altro che ottimale. Sono abbastanza sicuro che ci sia qualche vettorializzazione che posso fare per renderlo più veloce. Sto usando Matlab R2011a. Immagine originale
I suggerimenti sono apprezzati, grazie.
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)
Ho modificato una funzione della linea di disegno che ho trovato su matlab central per incrementare di un pixel di un valore invece di impostare un pixel su un valore
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