Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
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
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
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);
%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