Contents
Leer la imagen
I = imread('circuit.tif');
Detectar contornos
BW = edge(I,'canny');
figure, imshow(BW);
Calcular la transformada de Hough y visualizar el acumulador
% La funcion hough permite especificar dos parametros % [H, theta, rho] = hough(BW, ParameterName, ParameterValue) % donde: % ParemeterName ParameterValue % 'RhoResolution' Es un valor entre 0 y el tamaño de la diagonal de la % imagen, que especifica la cuanficacion del parametro % rho. Por defecto vale 1 % 'Theta' Es un vector que especifica el conjunto de posibles % valores de theta. El rango de posibles valores % -90 <= theta < 90 [H,theta,rho] = hough(BW); % H es el acumulador. Cada fila representa un posible valor de rho y cada % columna un posible valor de theta. % theta y rho son vectores con todos los posibles valores de theta y rho % empleados % visualizacion del acumulador figure, imshow(imadjust(mat2gray(H)),[],'XData',theta,'YData',rho,... 'InitialMagnification','fit'); xlabel('\theta (degrees)'), ylabel('\rho'); axis on, axis normal, hold on; colormap(hot)
Busqueda de picos
% Identifica picos en el acumulador. Ademas del acumulador y el numero de % picos que se desean encontrar, podemos pasarle otros dos parámetros: % peaks = houghpeaks(H, numpeaks, param1, val1, param2, val2) % param val % 'threshold' escalar positivo que especifica el umbral minimo para que % considere un pico. Por defecto es el 50% del maximo del % acumulador % 'NHoodSize' Un vector de dos enteros impares que indican el tamaño de % la ventana de supresion tras localizar un pico. Por defecto % son los menores impares mayores o iguales que las % dimensiones del acumulador dividas por 50. P = houghpeaks(H,5,'threshold',ceil(0.3*max(H(:)))); % el resultado es una matriz con dos columnas que indican la fila y la % columna del pico. Las filas corresponden con los valores de rho y las % columnas con los valores de theta x = theta(P(:,2)); y = rho(P(:,1)); plot(x,y,'s','color','black');
Obtención de los puntos que pertenecen a la linea
% houghlines permite obtener los segmentos de puntos de la imagen asociados % con una celda del acumulador. theta y rho son los valores devueltos por % la funcion hough y P son las posiciones de las celdas que queremos % analizar (normalmente los valores devueltos por peaks) % La función admite dos parametros adicionales: % param val % 'FillGap' real positivo que especifica la distancia entre dos segmenos % asociados con una misma celda del acumulador. Si la distancia % es menor a la indicada (por defecto 20), la función fusiona los % dos trozos en un mismo segmento. % 'MinLength' real positivo que especifica cuando los segmentos % fusionados deben descartarse o no. Si la linea es mas corta % del valor especificado (por defecto 40), la linea se % descarta. lines = houghlines(BW,theta,rho,P,'FillGap',5,'MinLength',7); % lines es un array de estructuras con los siguientes campos: % .point1 -> vector [x y] que especifica las coordenadas de un extremo del % segmento % .point2 -> vector [x y] que especifica las coordenadas del otro % extremo % theta -> valor del angulo (en grados) % rho -> valor de la distancia al origen. % dibujar los segmentos sobre la imagen figure, imshow(I), hold on max_len = 0; for k = 1:length(lines) % matriz en la que cada fila es un segmento xy = [lines(k).point1; lines(k).point2]; % dibujar el segmento plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green'); % Marcar el comienzo y el final del 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'); % Buscar el segmento mas largo len = norm(lines(k).point1 - lines(k).point2); if ( len > max_len) max_len = len; xy_long = xy; end end % Dibujar el segmento mas largo en otro color plot(xy_long(:,1),xy_long(:,2),'LineWidth',2,'Color','red');