Transformada de Hough
Image Processing Toolbox™ admite funciones que permiten utilizar la transformada de Hough para detectar rectas en una imagen.
La función hough
implementa la transformada de Hough estándar (SHT). La transformada de Hough está diseñada para detectar rectas utilizando la representación paramétrica de una recta:
rho = x*cos(theta) + y*sin(theta)
La variable rho
es la distancia desde el origen hasta la recta a lo largo de un vector perpendicular a la recta. theta
es el ángulo entre el eje x y este vector. La función hough
genera una matriz del espacio de parámetros cuyas filas y columnas se corresponden con estos valores rho
y theta
, respectivamente.
Después de calcular la transformada de Hough, puede utilizar la función houghpeaks
para encontrar valores pico en el espacio de parámetros. Estos picos representan rectas potenciales de la imagen de entrada.
Después de identificar los picos en la transformada de Hough, puede utilizar la función houghlines
para encontrar los puntos finales de los segmentos de la recta que corresponden a picos en la transformada de Hough. Esta función rellena automáticamente los huecos pequeños en los segmentos de la recta.
Detectar rectas en imágenes utilizando Hough
Este ejemplo muestra cómo detectar rectas en una imagen utilizando la transformada de Hough
.
Lea una imagen en el espacio de trabajo y, para hacer que este ejemplo sea más ilustrativo, gire la imagen. Muestre la imagen.
I = imread('circuit.tif'); rotI = imrotate(I,33,'crop'); imshow(rotI)
Encuentre los bordes en la imagen utilizando la función edge
.
BW = edge(rotI,'canny');
imshow(BW);
Calcule la transformada de Hough de la imagen binaria devuelta por edge
.
[H,theta,rho] = hough(BW);
Muestre la transformada, H
, devuelta por la función hough
.
figure imshow(imadjust(rescale(H)),[],... 'XData',theta,... 'YData',rho,... 'InitialMagnification','fit'); xlabel('\theta (degrees)') ylabel('\rho') axis on axis normal hold on colormap(gca,hot)
Encuentre los picos en la matriz de la transformada de Hough, H
, utilizando la función houghpeaks
.
P = houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));
Superponga una gráfica en la imagen de la transformada que identifique los picos.
x = theta(P(:,2)); y = rho(P(:,1)); plot(x,y,'s','color','black');
Encuentre las rectas en la imagen utilizando la función houghlines
.
lines = houghlines(BW,theta,rho,P,'FillGap',5,'MinLength',7);
Cree una gráfica que muestre la imagen original con las rectas superpuestas sobre ella.
figure, imshow(rotI), hold on max_len = 0; for k = 1:length(lines) xy = [lines(k).point1; lines(k).point2]; plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green'); % Plot beginnings and ends of lines plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow'); plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red'); % Determine the endpoints of the longest line segment len = norm(lines(k).point1 - lines(k).point2); if ( len > max_len) max_len = len; xy_long = xy; end end % highlight the longest line segment plot(xy_long(:,1),xy_long(:,2),'LineWidth',2,'Color','red');