Los algoritmos serán probados inicialmente en el entorno MATLAB el cual cuenta con un set de funciones para el procesamiento digital de imagen y video, con la ventaja de poder encontrar referencias y ejemplos de procesamiento en esta herramienta, Se presentaran los algoritmos utilizados los cuales contienen los comentarios pertinentes acerca de las funciones utilizadas, por simplicidad se explicaran algunos de los comandos utilizados pero puedes bajar los archivos del siguiente
linkLectura de la imagen.
%% Lectura de la imagen desde archivo
tic
I = imread('1.jpg'); % carga imagen en la variable I
figure, imshow(I); % muestra la imagen
I=rgb2gray(I); % Conversion RGB a gray
figure, imshow(K);Apertura y cierre
%% Apertura y cierre
se = strel('disk',3); % Crea un elemento estructurante "Disco de 3*3"
bw2 = imclose(JU,se); % Closing de la imagenbw3 = imopen(bw2,se); % Opening de la imagen Transformada de hough y dibujado de las lineas
%% transformada de hough
[H,Theta,Rho] = hough(SK);
P = houghpeaks(H,10,'threshold',ceil(0.3*max(H(:))));
lines = houghlines(SK,Theta,Rho,P);
lenlines=1:1:length(lines);
max_len = 0;
largolines = length(lines);
valory = zeros(1,(largolines*2));
valorx = zeros(1,(largolines*2));
for k = 1:largolines
valory(k) = lines(k).point1(2);
valory(k+largolines) = lines(k).point2(2);
valorx(k) = lines(k).point1(1);
valorx(k+largolines) = lines(k).point2(1);
xy = [lines(k).point1; lines(k).point2];
%plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');
% Plot beginnings and ends of lines
%plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');
%plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');
% Determine the endpoints of the longest line segment
len = norm(lines(k).point1 - lines(k).point2);
if ( len > max_len)
max_len = len;
xy_long = xy;
end
%message = sprintf('Ang=%2.3f leng=%2.3f',lines(k).theta,len);
%text(15,15+10*k,message,'Color','y','FontWeight','bold');
lenlines(k)=len;
%angulo(k) = lines(k).theta*pi/180;End
Transformada de hough y dibujado de las lineas
%% transformada de hough
[H,Theta,Rho] = hough(SK);
P = houghpeaks(H,10,'threshold',ceil(0.3*max(H(:))));
lines = houghlines(SK,Theta,Rho,P);
lenlines=1:1:length(lines);
max_len = 0;
largolines = length(lines);
for k = 1:largolines
valory(k) = lines(k).point1(2);
valory(k+largolines) = lines(k).point2(2);
xy = [lines(k).point1; lines(k).point2];
plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');
% Plot beginnings and ends of lines
plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');
plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');
% Determine the endpoints of the longest line segment
len = norm(lines(k).point1 - lines(k).point2);
if ( len > max_len)
max_len = len;
xy_long = xy;
end
message = sprintf('Ang=%2.3f leng=%2.3f',lines(k).theta,len);
text(15,15+10*k,message,'Color','y','FontWeight','bold');
lenlines(k)=len;
angulo(k) = lines(k).theta*pi/180;
end
Características extraídas del tratamiento de imágenes
click derecho
línea con punto xy cuya coordenada y es la mayor, y coordenadas x a la derecha del centro de masa.
click izquierdo
línea con punto xy cuya coordenada y es la mayor, y coordenadas x a la izquierda del centro de masa.
doble click derecho
línea con punto xy cuya coordenada y es la mayor, y coordenadas x a la izquierda del centro de masa. Punto x mas alejado a la derecha.
Los resultados obtenidos fueron satisfactorios hasta cierto punto ya que se logro calcular las líneas de Hough pero estas presentan mucha complejidad a la hora de realizar la caracterización ya este método seria sensible a escalamiento, por tanto se opta por realizar el algoritmo con la segunda alternativa que son los momentos de Hu, en seguida se explica el algoritmo utilizado para esta alternativa
Momentos de Hu
El algoritmo utilizado para los momentos de Hu fue encontrado en la siguiente página.
http://dmery.ing.puc.cl/dmery/dmery/docencia/patrones/matlab/MomentosHu.zip
Donde Se encuentran algunos ejemplos elaborados en MATLAB sobre procesamiento digital de imágenes.
Este algoritmo calcula los siete momentos de Hu a una imagen ya procesada y recibe como parámetros la imagen segmentada, ósea la matriz de etiquetas de la imagen.
Nuestro procesamiento lo pueden descargar del siguiente linK
Descripción.
Antes de calcular los momentos de Hu se debe realizar la segmentación de la imagen.
[L,n] = bwlabel(bw3,4); % Matriz de etiquetas L
HM = HuMom(L); % Calculo de los momentos de Hu
Los resultados se despliegan en una grafica de dos dimensiones x-y, donde en cada eje se grafica un momento. Analizando cual par (Momento x,Momento y) es el mas adecuado, para hacer la clasificación de los comandos en el espacio 2-dimensional.
x = input('Momento de Hu eje x?');
y = input('Momento de Hu eje y?');
clf
plot(Z(k1,x),Z(k1,y),'r*')
hold on
plot(Z(k2,x),Z(k2,y),'g+')
plot(Z(k3,x),Z(k3,y),'bo') plot(Z(k4,x),Z(k4,y),'k<')