Main Content

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)

Figure contains an axes object. The axes object contains an object of type image.

Encuentre los bordes en la imagen utilizando la función edge.

BW = edge(rotI,'canny');
imshow(BW);

Figure contains an axes object. The axes object contains an object of type image.

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)

Figure contains an axes object. The axes object with xlabel theta blank (degrees), ylabel rho contains an object of type image.

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');

Figure contains an axes object. The axes object with xlabel theta blank (degrees), ylabel rho contains 2 objects of type image, line. One or more of the lines displays its values using only markers

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');

Figure contains an axes object. The axes object contains 38 objects of type image, line. One or more of the lines displays its values using only markers