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:
- ¿Cómo seleccionar la intensidad máxima en Hough transform en MATLAB?
- Cálculo de desplazamiento movido en MATLAB
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).