Modelos, Control y Sistema de Visión

Central     Modelos     Control     Visión     Aplicaciones     Mapa del sitio     Publicaciones     Sobre el autor      

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