Ejemplo de detección de líneas aplicando la transformada de Hough Sea la imagen que se muestra a continuación, a la que se desea identificar las líneas utilizando la transformada de Hough Cuando se desconoce el número de líneas, se propone un número elevado de líneas en la transformada >> [H,T,R] = hough(II); >>P = houghpeaks(H,11) P = 371 137 505 137 426 137 382 137
Como se puede apreciar en la figura, existen 5 líneas (una separada), sin embargo se han identificado 4 líneas. Se buscan los intervalos en los parámetros de la transformada de Hough que generen 5 líneas for i=0.1:.1:2 [H,T,R] = hough(II,'RhoResolution',i,'ThetaResolution',i); % Se define un valor superior a las líneas conocidas P = houghpeaks(H,11); [a, b]=size(P); if a==5 i end end |
Una de las soluciones se muestra a continuación [H,T,R] = hough(II,'RhoResolution',.8,'ThetaResolution',.8); Para obtener y visualizar las líneas sobre la imagen original se utiliza el siguiente programa, que es válido para cualquier aplicación (fuente: houghlines) lineas = houghlines(II,T,R,P,'FillGap',20,'MinLength',40); %Imagen sobre la que se desea visualizar las líneas figure, imshow(II), hold on % Se visualizan las líneas max_len = 0; for k = 1:length(lineas) xy = [lineas(k).point1; lineas(k).point2]; plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green'); plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow'); plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red'); end |
Como se han logrado detectar 5 líneas, para identificar las mismas se aplica >> P = houghpeaks(H,5)
Existe la posibilidad de que al tratar de identificar las líneas detectadas en la transformada de Hough >>houghlines(II,T,R,P) ans = 1x1 struct array with no fields
No se devuelve ningún valor en la estructura, por lo que es necesario ajustar los parámetros de la función que extrae las líneas (houghlines). Los parámetros que influyen son
'FillGap' Valor positivo que indica una distancia por debajo de la cual se unen segmentos de líneas que han sido detectados como un punto por la función houghpeaks (implícito, 20).
'MinLength' Valor positivo que indica una distancia por debajo de la cual se unen líneas próximas entre sí (implícito, 40).
Para ver su efecto se aumenta un parámetro, manteniendo el otro constante, por ejemplo lineas = houghlines(II,T,R,P,'FillGap',50,'MinLength',40); lineas = 1x5 struct array with fields: point1 point2 theta rho
 |
lo que provoca la unión de la línea central, interpretándose ahora como una única línea.
Si se desea reducir la resolución en la detección de líneas, se aumenta el parámetro 'MinLength', de lo que resulta lineas = houghlines(II,T,R,P,'FillGap',50,'MinLength',118); Líneas principales de un edificio Supóngase que se desea determinar el número de líneas fundamentales del siguiente edificio La solución puede ser el siguiente programa clear all; I=imread('building.jpg'); II=im2bw(I);
% Limpia imagen III=bwareaopen(II,250);
% Extrae perímetro ee=strel('diamond',3); III2=imerode(III,ee); IV=III-III2;
% Aplica la transformada [H,T,R] = hough(IV,'RhoResolution',3,'ThetaResolution',3); % Se define un valor superior a las líneas P = houghpeaks(H,20);
% Define las líneas lineas = houghlines(IV,T,R,P,'FillGap',40,'MinLength',40); figure, imshow(II), hold on max_len = 0; for k = 1:length(lineas) xy = [lineas(k).point1; lineas(k).point2]; plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');
% Visualiza las líneas plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow'); plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red'); end |

II |

IV |
|