Visión por computadora
Enviado por Tekno LZC • 28 de Noviembre de 2019 • Tesis • 5.142 Palabras (21 Páginas) • 296 Visitas
[pic 1][pic 2][pic 3][pic 4]
Ejercicio 1: Considere los cinco objetos ya usados (tornillo, rondana, armella, alcayata y cola de milano) y lleve a cabo lo siguiente:
a) Elija dos o tres rasgos descriptores. Grafique y verifique si el fenómeno de separación lineal se presenta o no. Esto depende de los rasgos seleccionados.
b) Con base en estos rasgos, entrene los clasificadores de distancia mínima, de Mahalanobis y Bayesiano.
c) Tome el conjunto de 100 imágenes de prueba (las imágenes con más de un objeto en ellas) y con estas verifique el desempeño de los tres clasificadores. Forme una matriz de confusión de tamaño 5x5. Si para un clasificador dado, todos los objetos fueron correctamente clasificados, entonces en las diagonales aparecerá un 100 por ciento, sino aparecerán otros porcentajes fuera de las diagonales.
d) ¿Qué clasificador mostró el mejor desempeño? Comente al respecto.
1.-
a) En esta parte del ejercicio 1, se eligieron los rasgos descriptores: área y perímetro del objeto en la imagen. Se realizó un programa en Matlab, el cual binariza todas las imágenes de prueba (imágenes en donde aparecen solo objetos individuales) y extrae los patrones mencionados anteriormente, después grafica dichos patrones en un plano bidimensional con el área en las abscisas y el perímetro en las ordenadas como se muestra en la figura 1.
[pic 5]
Figura 1. Gráfica que ilustra las 5 diferentes clases de objetos.
En la figura 2 se puede apreciar a simple vista que las clases (con 20 elementos cada una) pueden ser separadas linealmente debido al espacio considerable existente entre ellas.
[pic 6]
Figura 2. Representación de la separación lineal que existe entre clases.
CONCLUSION.
Hablando de los rasgos área y perímetro, la buena binarización de las imágenes es fundamental para que los objetos sean correctamente clasificados y exista un buen espacio de separación entre clases, así los objetos parecidos, como las armellas y las alcayatas por ejemplo, pueden diferenciarse mejor y no confundirse entre sí.
b) Para realizar el inciso “b” del ejercicio, se utilizó Matlab para el diseño de una serie de funciones que realizaron el entrenamiento de los clasificadores de distancia mínima, distancia de mahalanobis y el clasificador bayesiano. El código de las funciones es mostrado a continuación.
Primero tenemos el programa con el cual obtenemos la gráfica presentada en el inciso anterior, las medias y las varianzas representativas de cada clase a partir de las 100 imágenes (un solo elemento por imagen).
hold on; %Para poder sobre escribir en la gráfica
grid; % Se dibuja una rejilla
title('Patrones de las imágenes de prueba'); %Se coloca el título a la gráfica
xlabel('Área del objeto'); %Se coloca la etiqueta de las abscisa
ylabel('Perímetro del objeto'); %Se coloca la etiqueta de las ordenadas
clase1=[]; %Se declara la clase 1 de tornillos
clase2=[]; %Se declara la clase 2 de rondanas
clase3=[]; %Se declara la clase 3 de armellas
clase4=[]; %Se declara la clase 4 de alcayatas
clase5=[]; %Se declara la clase 5 de colas de milano
i=101; %Se inicializa el índice de número de las imágenes de la primera clase (Tornillos)
k=120; %Se estable el límite de las imágenes de la primera clase (Tornillos)
%Los siguientes ciclos for sirven para ir cambiando de imágenes y por ende,
%de clases.
for c=1:5 %Para c desde 1 hasta 5 hacer...
for j=i:k %Para j desde i hasta k hacer...
dir=strcat('IMAG0',num2str(j),'.bmp'); %Se forma la dirección de la imagen a leer
imagen=imread(dir); %Se guarda la imagen leída
im_segmentada=segmenta(imagen); %Se segmenta la imagen con la función "segmenta" creada en tareas anteriores
if j>100 & j<200 %Si la imagen pertenece a la primera clase entonces...
area1=obten_area(im_segmentada,255); %Obtén el área del tornillo en número de pixeles
perimetro1=obten_perimetro(im_segmentada,255); %Obtén el perímetro del tronillo en número de pixeles
clase1=horzcat([area1;perimetro1],clase1); %Agrega los nuevos rasgos al vector de rasgos de la clase 1
plot(area1,perimetro1,'ro'); %Grafica con respecto al área y perímetro obtenido colocando un "o" color rojo
else
if j>200 & j<300 %Si la imagen pertenece a la segunda clase entonces...
area2=obten_area(im_segmentada,255); %Obtén el área de la rondana en número de pixeles
perimetro2=obten_perimetro(im_segmentada,255); %Obtén el perímetro de la rondana en número de pixeles
clase2=horzcat([area2;perimetro2],clase2); %Agrega los nuevos rasgos al vector de rasgos de la clase 2
plot(area2,perimetro2,'g+'); %Grafica con respecto al área y perímetro obtenido colocando un "+" color verde
else
if j>300 & j<400 %Si la imagen pertenece a la tercera clase entonces...
area3=obten_area(im_segmentada,255); %Obtén el área de la armella en número de pixeles
perimetro3=obten_perimetro(im_segmentada,255); %Obtén el perímetro de la armella en número de pixeles
clase3=horzcat([area3;perimetro3],clase3); %Agrega los nuevos rasgos al vector de rasgos de la clase 3
plot(area3,perimetro3,'b*'); %Grafica con respecto al área y perímetro obtenido colocando un "*" color azul
...