houghpeaks hough code matlab image-processing computer-vision hough-transform

houghpeaks - hough transform matlab code



Houghlines en MATLAB (2)

Después de detectar las líneas en una imagen usando líneas Hough , ¿cómo puedo usarlo para calcular el cambio en el ángulo (rotación) de las líneas de una imagen de referencia?


No estoy seguro de cuál es la implementación de MATLAB de la transformada Hough, pero la orientación de la línea será simplemente en ángulo recto (90 grados o pi / 2 radianes) con el ángulo que ha utilizado para identificar la línea en el primer lugar.

Espero que eso ayude. Hay una cobertura decente de las transformaciones de Hough en la web y Wikipedia es un buen lugar para comenzar.


Nota para los lectores: esta es una pregunta de seguimiento, refiérase a estos para el fondo:

El proceso es similar a lo que mostré antes. A continuación, estoy usando las imágenes de su pregunta anterior (dado que proporcionó solo una, creé la otra girando la primera por 10 grados).

Comenzamos por detectar las líneas para las dos imágenes. Hacemos esto con la ayuda de las funciones de transformación de Hough . Esto es lo que parece aplicado a ambas imágenes:

A continuación, queremos realizar el registro de imagen utilizando los puntos finales de línea como puntos de control. Primero, nos aseguramos de que los puntos se correspondan entre sí en las dos imágenes. Hago esto calculando el casco convexo usando convhull que los ordena automáticamente en el sentido contrario a las agujas del reloj (¡o está en la dirección opuesta!). Los números que se muestran arriba indican el orden.

Finalmente, usamos la función cp2tform para obtener la matriz de transformación, que usamos para alinear las imágenes y extraer la traducción, rotación y escalado.

El siguiente es el 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]

Y aquí está la función que extrae los puntos finales de las líneas:

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

con el resultado:

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

La rotación se recupera como casi 10 grados (con algunos errores inevitables) y la escala es efectivamente 1 (lo que significa que no se hizo zoom). Tenga en cuenta que había un componente de traducción en el ejemplo anterior, porque la rotación no se realizó alrededor del centro del signo de la cruz).