Houghlines em MATLAB

votos
2

Depois de detectar as linhas numa imagem utilizando linhas de Hough , como pode usá-lo para calcular a variação no ângulo (rotação) das linhas da imagem de referência?

Publicado 14/01/2010 em 06:55
fonte usuário
Em outras línguas...                            


2 respostas

votos
0

Eu não sei o que o MATLAB implementação da transformada de Hough é, mas a orientação da linha será simplesmente estar em um ângulo reto (90 graus ou pi / 2 radianos) para o ângulo que você usou para identificar a linha no primeiro lugar.

Espero que ajude. Não há cobertura decente de Hough transforma na Web e Wikipedia é um bom lugar para começar.

Respondeu 14/01/2010 em 07:07
fonte usuário

votos
3

Nota aos leitores: Esta é uma pergunta de acompanhamento, referem-se a estes para o fundo:


O processo é semelhante ao que eu mostrei antes. Abaixo eu estou usando as imagens de sua pergunta anterior (desde que você forneceu apenas um, eu criei o outro, girando a primeira de 10 graus).

Começamos por detectar as linhas para as duas imagens. Fazemos isso com a ajuda dos Hough transformam funções . Isso é o que parece aplicada a ambas as imagens:

Imagens com linhas detectadas e ordem pontos

Em seguida, queremos realizar o registro de imagem usando os pontos finais de linha como controle pontos. Primeiro, certifique-se os pontos correspondem um ao outro nas duas imagens. Eu faço isso calculando o casco convexo usando convhullque classifica-los automaticamente em sentido anti-horário-ordem (ou é na direção oposta!). Os números mostrados acima indicam o fim.

Finalmente, usamos a função cp2tformpara obter a matriz de transformação, que usamos para alinhar as imagens e extrair a tradução, rotação e escala.

A seguir está o código completo:

%% # Step 1: read and prepare images
%# (since you provided only one, I created the other by rotating the first).
I1 = imread('http://i.stack.imgur.com/Se6zX.jpg');
I1 = rgb2gray( imcrop(I1, [85   35  445  345]) ); %# Get rid of white border
I2 = imrotate(I1, -10, 'bilinear', 'crop'); %# Create 2nd by rotating 10 degrees

%% # Step 2: detect the cross sign endpoints (sorted in same order)
p1 = getCross(I1);
p2 = getCross(I2);

%% # Step 3: perform Image Registration
%# Find transformation that maps I2 to I1 using the 4 control points for each
t = cp2tform(p2,p1,'affine');

%# Transform I2 to be aligned with I1
II2 = imtransform(I2, t, 'XData',[1 size(I1,2)], 'YData',[1 size(I1,1)]);

%# Plot
figure('menu','none')
subplot(131), imshow(I1), title('I1')
subplot(132), imshow(I2), title('I2')
subplot(133), imshow(II2), title('I2 (aligned)')

%# Recover affine transformation params (translation, rotation, scale)
ss = t.tdata.Tinv(2,1);
sc = t.tdata.Tinv(1,1);
tx = t.tdata.Tinv(3,1);
ty = t.tdata.Tinv(3,2);
scale = sqrt(ss*ss + sc*sc)
rotation = atan2(ss,sc)*180/pi
translation = [tx ty]

E aqui está a função que extrair as linhas endpoints:

function points = getCross(I)
    %# Get edges (simply by thresholding)
    I = imfilter(I, fspecial('gaussian', [7 7], 1), 'symmetric');
    BW = imclearborder(~im2bw(I, 0.5));

    %# Hough transform
    [H,T,R] = hough(BW);

    %# Detect peaks
    P  = houghpeaks(H, 2);

    %# Detect lines
    lines = houghlines(BW, T, R, P);

    %# Sort 2D points in counterclockwise order
    points = [vertcat(lines.point1); vertcat(lines.point2)];
    idx = convhull(points(:,1), points(:,2));
    points = points(idx(1:end-1),:);
end

com o resultado:

Resultante imagem alinhados

scale =
    1.0025
rotation =
   -9.7041
translation =
   32.5270  -38.5021

A rotação é recuperado como quase 10 graus (com algum erro inevitável), e a escala é efectivamente um (o que significa que não houve zoom). Note-se que havia uma componente tradução no exemplo acima, porque a rotação não foi realizada em torno do centro do sinal de cruzamento).

Respondeu 17/01/2010 em 03:08
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more