Detectar líneas con la transformada de Radon
En este ejemplo se muestra cómo detectar líneas en una imagen utilizando la transformada de Radon. La transformada de Radon está estrechamente relacionada con una operación de visión artificial común conocida como la transformada de Hough. Puede utilizar la función radon
para aplicar una forma de la transformada de Hough usada para detectar líneas rectas.
Calcular la transformada de Radon de una imagen
Lea una imagen en el área de trabajo. Conviértala a una imagen en escala de grises.
I = fitsread("solarspectra.fts");
I = rescale(I);
Muestre la imagen original.
figure
imshow(I)
title("Original Image")
Calcule una imagen de borde binaria usando la función edge
. Muestre la imagen binaria devuelta por la función edge
.
BW = edge(I);
figure
imshow(BW)
title("Edges of Original Image")
Calcule la transformada de Radon de la imagen con la función radon
. Las ubicaciones de los picos en la transformada se corresponden con las ubicaciones de las líneas rectas de la imagen original.
theta = 0:179; [R,xp] = radon(BW,theta);
Muestre el resultado de la transformada de Radon.
figure imagesc(theta,xp,R) colormap(hot) xlabel("\theta (degrees)") ylabel("x^{\prime} (pixels from center)") title("R_{\theta} (x^{\prime})") colorbar
Interpretar los picos de la transformada de Radon
Calcule los valores de desplazamiento θ y x' de los cinco mayores picos. Los valores xp_peak_offset
representan el desplazamiento del pico desde el centro de la imagen, en píxeles.
R_sort = sort(unique(R),"descend");
[row_peak,col_peak] = find(ismember(R,R_sort(1:5)));
xp_peak_offset = xp(row_peak);
theta_peak = theta(col_peak);
Añada un marcador x en el centro de la imagen original. Los índices de fila se asignan a la dirección y y las columnas se asignan a la dirección x, por lo que debe calcular centerX
como la mitad del número de columnas y centerY
como la mitad del número de filas de la imagen I
.
centerX = ceil(size(I,2)/2); centerY = ceil(size(I,1)/2); figure imshow(I) hold on scatter(centerX,centerY,50,"bx",LineWidth=2)
Hay tres picos marcados con θ = 1 grado y desplazamientos de –80, –84 y –87 píxeles desde el centro. Represente la línea radial que pasa por el centro a un ángulo de θ = 1 grado como una línea roja discontinua. Represente la transformada de Radon como líneas rojas continuas perpendiculares a la línea discontinua y desplazadas –80, –84 y –87 píxeles desde el centro, lo que las coloca a la izquierda.
[x1,y1] = pol2cart(deg2rad(1),5000); plot([centerX-x1 centerX+x1],[centerY+y1 centerY-y1],"r--",LineWidth=2) [x91,y91] = pol2cart(deg2rad(91),100); for i=1:3 plot([centerX-x91+xp_peak_offset(i) centerX+x91+xp_peak_offset(i)], ... [centerY+y91 centerY-y91], ... "r",LineWidth=2) end
También hay dos picos marcados a θ = 91 grados con desplazamientos de –8 y –44 píxeles desde el centro. Represente la línea radial que pasa por el centro a un ángulo de θ = 91 grados como una línea verde discontinua. Represente los picos de Radon como líneas verdes continuas perpendiculares a la línea discontinua y desplazadas –8 y –44 píxeles desde el centro, lo que las coloca abajo.
plot([centerX-x91 centerX+x91],[centerY+y91 centerY-y91],"g--",LineWidth=2) for i=4:5 plot([centerX-x1 centerX+x1], ... [centerY+y1-xp_peak_offset(i) centerY-y1-xp_peak_offset(i)], ... "g",LineWidth=2) end