Está en la página 1de 5

TDI. Prctica libre.

Transformada de Hough
Introduccin
La transformada de Hough permite, tras el preprocesamiento de una imagen, detectar todas las lneas rectas dentro de una imagen. Estas aparecen ordenadas en una matriz, que dependiendo del formato adoptado para representar la rectas, ya sea por su ngulo y su distancia el origen o por la pendiente y la ordenada en el origen, de mayor a menor longitud. Este informe se divide en tres apartados: a) Programacin en MatLab de la transformada de Hough b) Ejemplo de uso de la transformada de Hough preinstalada en MatLab c) Ejemplo de aplicacin de la transformada.

Alejandro Martnez Jordn

Implementacin de la transformada de Hough en MatLab

Cdigo:
function[cuadro,m,b]=hough2(imagen,Nm,Nb) [M,N]=size(imagen); mask=ones(M,N,3); cuadro=zeros(Nm,Nb); %matriz de hough %intervalos de discretizacion de pendiente %y ordenada en el origen incm=2/(Nm-1); incb=4*M/(Nb-1); %binarizar imagen level=graythresh(imagen); imbin=im2bw(imagen,level); for x=1:M for y=1:N if (imbin(x,y)==0) for m=-1:incm:1 %muestreo en m b=y-m*x; %discretizacin de los valores bd=floor((b+2*M)/incb)+1; md=floor((m+1)/incm)+1; cuadro(md,bd)=cuadro(md,bd)+1; end end

end end %Buscamos el mayor valor max=0; for x=1:Nm for y=1:Nb if cuadro(x,y)>=max max=cuadro(x,y); maxm=x; maxb=y; end end end % D/A de m y b m=((maxm-1)*incm)-1; b=((maxb-1)*incb)-2*N; for x=1:N recta(x)=m*x+b; mask(floor(recta(x)),x,2)=0; end %dibujar la imagen con una recta azul imgline(:,:,2)=imagen(:,:).*mask(:,:,2); imgline(:,:,1)=imagen(:,:); imgline(:,:,3)=imagen(:,:); figure imshow(imgline) end

.-Este es el resultado de buscar la recta mayor en el cameraman

Ejemplo de uso de la transformada propia de MatLab


En MatLab existe la funcin Hough, que devuelve una matriz con ro y theta, es decir, el ngulo que forman las rectas y su distancia perpendicular hasta el origen de coordenadas. A dicha funcin hay que pasarle una imagen binarizada. Adems otras dos funciones auxiliares de mucha ayuda, houghpeaks, que encuentra los mximos dentro de la matriz Hough y houghlines que dibuja los segmentos mayores. A continuacin un cdigo ejemplo de uso de dichas funciones:
img=imread('cameraman.tif'); I=img; %pre-procesamiento level = graythresh(I); bw=im2bw(I,level); subplot(1,2,1) imshow(bw) title('Imagen Binarizada') %preprocesamiento bw=edge(bw,'sobel','vertical'); subplot(1,2,2) imshow(bw) title('Imagen filtrada: detec. de bordes')

%Las tres funciones de la transformada [H,T,R]=hough(bw); peaks=houghpeaks(H,5); lines=houghlines(bw,T,R,peaks);

image hold on imshow(img); max_len=0; for k = 1:length(lines) xy = [lines(k).point1; lines(k).point2]; plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green'); % dibuja el principo y el final de cada segmento plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow'); plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red'); % dibuja el segmento len = norm(lines(k).point1 - lines(k).point2); if ( len > max_len) max_len = len; xy_long = xy; end end title('Imagen original y 5 primeras lneas')

Imagen Binarizada

Imagen original y 5 primeras lneas

Ejemplo de aplicacin de la transformada


La aplicacin consiste en obtener la hora de un reloj de manecillas mediante una foto del mismo. A partir de la transformada de Hough hallamos el ngulo que forma las manecillas del minutero y de las horas y consecuentemente sacamos la hora. En este caso se ha aplicado un preprocesamiento de la imagen que acta del siguiente modo: Primero se binariza, despus se redimensiona y se recorta para eliminar el borde de la esfera del reloj, despus se aplican operaciones morfolgicas de erosin y dilatacin para eliminar la aguja del segundero y para que las otras dos manecillas se correspondan con una sola recta y no con varias paralelas y por ltimo se aplica la transformada.

img=imread('r1.jpg');%Lectura de la imagen imshow(img); I=rgb2gray(img); %Pre-procesamiento: binarizar bw=im2bw(I,0.84); %Pre-procesamiento: redimensionamiento y recortado [m n]=size(bw); m2=floor((0.4*m)/2); n2=floor((0.4*n)/2); cm=floor(m/2); cn=floor(n/2); bw=bw((cm-m2:cm+m2),(cn-n2:cn+n2)); img=img((cm-m2:cm+m2),(cn-n2:cn+n2)); %Pre-procesamiento: operaciones morfolgicas ee=strel('disk',3); bw=imdilate(bw,ee);

ee=strel('disk',2); bw=imerode(bw,ee); bw=~bw; ee=strel('disk',3); bw=imerode(bw,ee);

%transformada de hough [H,T,R]=hough(bw); peaks=houghpeaks(H,2) lines=houghlines(bw,T,R,peaks); %Obtenemos la hora a partir del ngulo que forman la manecillas min_ang=peaks(1,2); min=round((min_ang*60)/360) hor_ang=peaks(2,2); horas=round(hor_ang*12)/360; horas=floor(horas); if horas==0; horas=12; end min=num2str(min); horas=num2str(floor(horas)); mess=['Son las ',horas,' y ',min,' minutos']; msgbox(mess); end

También podría gustarte