Guía de Visión Artificial
Guía de Visión Artificial
Guía de Visión Artificial
Primera clase:
Una imagen digital se considera como una cuadrícula. Cada elemento de esa cuadrícula se
llama Píxel (Picture element). Para cargar una imagen en Matlab se utiliza el comando
imread().
El tratamiento de imágenes sirve para detectar aspectos específicos de una imagen (como plagas
en imágenes, círculos, cuadrados, etc), para realizar esto se precisan de ciertos factores para
realizar el respectivo análisis.
Lo principal, como se observa en la figura anterior es binarizar la imagen, esto se puede realizar de
dos maneras. Creando una función de binarización(se puede consultar en internet la función de
binarización) o utilizar el comando im2bw.
Figura 3: Imagen (A) binarización por la función de Matlab, imagen (B) original en RGB.
Estas imágenes (imágenes binarizadas), poseen la característica de solo poseer ceros y unos en sus
pixeles, tal como se observa en la figura 4.
El comando para saber los pixeles de una imagen en Matlab se llama imtool().
NOTA: Las imágenes deben estar en la misma carpeta que el programa que se ejecuta, además el
número 0.46 es el porcentaje de binarización (se recomienda variarlo para observar que sucede).
Imagen RGB:
Esta imagen posee tres componentes (Componente rojo, azul y verde), lo cual permite observar 17
millones de colores(bueno casi 16.581.375).
Estas matrices rojas, verdes y azules se pasan a escala de grises(o binarizarlas) para realizar su
respectivo tratamiento de imagen.
clc;clear all;
RGB = imread('anabel.jpg'); %carga la imagen
f1 = figure(1);, set(f1, 'color', 'w');, clf; % Crea Figura
subplot(1,4,1); % Selecciona el 1 subplot
imshow(RGB); title('Imagen Color'); % Visualiza imagen color
subplot(1,4,2); % Selecciona el 2 subplot
imshow(RGB(:,:,1)); title('Componente Rojo'); % Visualiza componente R
subplot(1,4,3); % Selecciona el 3 subplot
imshow(RGB(:,:,2)); title('Componente Verde'); % Visualiza componente G
subplot(1,4,4); % Selecciona el 4 subplot
imshow(RGB(:,:,3)); title('Componente Azul');
Para eliminar ruido (datos no deseados), de nuestras imágenes se precisa de usar filtros, en el caso
de Matlab el filtro a utilizar se llama bwareaopen(bw,40), el valor bw es una imagen binarizada y
el numero 40 es el tamaño del ruido a eliminar(por lo general hay que jugar con la binarización y
con el valore del filtro para obtener mejores resultado).
Ejercicio
Tomar una imagen en RGB, obtener cualquier componente (una opción en rojo) en escala de
grises, realizar una binarización y posteriormente aplicarle el filtro.
Programa:
i=imread('anabel.jpg');% Carga la imagen RGB
R=i(:,:,1); %Toma la componente en rojo de la matriz RGB
bw=im2bw(R,0.79);% binarización de la componente en rojo
bwm1=bwareaopen(bw,79610); % Aplicación del filtro
figure (1)
imshow(i); %muestra la imagen RGB
figure(2)
imshow(R);% muestra la imagen de la componente roja
figure(3)
imshow(bwm1);% muestra la imagen aplicando el filtro
figure (4)
imshow(bw) %muestra la imagen binarizada
La finalidad del programa anterior es obtener la bluza, cara, cuello de la imagen RGB.
Figura 9: Ejercicio 1.
SEGUNDA CLASE:
En esta segunda sección se hablará del comando bwconncomp(), el cual permite encontrar los
objetos en una imagen binarizada, además utilizando el comando labelmatrix () permite etiquetar
las regiones encontradas con el comando anterior lo cual da como resultado que se pueda utilizar
el comando label2rgb() para visualizarla como se observa en las siguiente figuras:
Figura 10: Pre procesamiento de imagen de varios objetos del mismo color.
Ya con las figuras etiquetadas las podemos separar, para trabajar con cada objeto
independientemente.
Ya separando los objetos por etiquetado podemos cambiar los colores o colocar nombres (como
un programa que caracteriza objetos).
Ademas de jugar con las apariencias podemos colocar el nombre a cada imagen para clasificarlas,
para eso se precisa de conocer los siguientes comandos, bwlabel () permite etiquetar las zonas
donde están los objetos, regionprops() permite conocer las estadísticas de la imagen, dando a
conocer aspectos propios de la imagen.
Este ultimo comando despliega toda una lista de estadísticas de una imagen como lo muestra la
siguiente figura:
Figura 15: Propiedades de una imagen.
Con las características de la imagen podemos colocarles nombre mediante el comando text() y
utilizando la propiedad del centroid, lo cual da como resultado final la siguiente imagen.
Figura 16 imagen original con nombres.
Erosión
Esta función en Matlab permite desagrupar objetos que se encuentran unidos como en la
siguiente figura:
Dilatar:
Esta función en Matlab permite definir mejor un objeto (también lo hace un poco mas
grande).
Figura 18: Imagen normal vs imagen erosionada.
Closing:
Esta función permite dilatar y erosionar al mismo tiempo, permitiendo definir un objeto
dejando con su forma original.
En este punto utilizamos la matriz con componente azul para realizar la binarización y posterior
procesamiento.
Figura 22: binarización de la matriz azul.
Tercera Clase.
Para realizar esta acción se precisa de utilizar el comando de imrotate(), el cual permite rotar la
imagen en cualquier ángulo.
Esta herramienta permite extraer unos pixeles específicos de la imagen (un recorte de la imagen),
el comando que permite realizar esto es el imcrop(imagen, [xmin,ymin,ancho,altura]).
Esta función de que Matlab tiene predeterminada nos permite identificar los bordes de los objetos
de una imagen de manera fácil y sencilla permitiendo realizar un mejor tratamiento de imágenes.
El comando utilizado para esta tarea es el de edge(Gr,'canny'), donde Gr es la imagen en
escala de grises y canny es la función utilizada para hallar los bordes.
Utilizando la función sobel (la cual esta por defecto en caso tal que no se especifique la función).
for i=800:m
for j = 1:n
if(bwm1(i,j)==1) %Permite hallar solo la figura 1
bwm1(i,j)=0;
end
end
end
CC = bwconncomp(bwm1); %Comando para encontrar elementos en una imagen
binarizada
L = labelmatrix(CC);% crea etiquetas para realizar la caracterización
[m,n]=size(L);%Halla las filas y columnas de la matriz L
figure(3)
imshow(bwm1)
T1=1; %Etiqueta de la figura 1
T2=2; %Etiqueta de la figura 2
for i=1:m
for j = 1:n
if(L(i,j)~=T2) %Permite hallar solo la figura 1
salida1(i,j) = 0;
else
salida1(i,j) =1;
end
end
end
%%
primera=bwlabel(salida1); %Se etiqueta la primera imagen para hallar sus
caracteristicas
ESTADISTICAS1= regionprops(primera,'all');%Halla las propiedas de la
imagen 1
f2 = figure(4);, set(f2, 'color', 'w');, clf; % Crea Figura
subplot(1,1,1); % Selecciona el 1 subplot
imshow(salida1); title('Llave'); %
%%
EJEX=ESTADISTICAS1(1).Centroid(2); %Guarda el dato de centroide x de la
figura 1
EJEY=ESTADISTICAS1(1).Centroid(1); %Guarda el dato de centroide y de la
figura 1
end
end
%%
primera=bwlabel(salida1); %Se etiqueta la primera imagen para hallar sus
caracteristicas
segunda=bwlabel(salida2); %Se etiqueta la primera imagen para hallar sus
caracteristicas
tercera=bwlabel(salida3); %Se etiqueta la primera imagen para hallar sus
caracteristicas
cuarta=bwlabel(salida4); %Se etiqueta la primera imagen para hallar sus
caracteristicas
ESTADISTICAS1= regionprops(primera,'all');%Halla las propiedas de la
imagen 1
ESTADISTICAS2= regionprops(segunda,'all');%Halla las propiedas de la
imagen 1
ESTADISTICAS3= regionprops(tercera,'all');%Halla las propiedas de la
imagen 1
ESTADISTICAS4= regionprops(cuarta,'all');%Halla las propiedas de la
imagen 1
f2 = figure(4);, set(f2, 'color', 'w');, clf; % Crea Figura
subplot(1,4,1); % Selecciona el 1 subplot
imshow(salida1); title('Fondo'); %
subplot(1,4,2); % Selecciona el 1 subplot
imshow(salida2); title('Ruido'); %
subplot(1,4,3); % Selecciona el 1 subplot
imshow(salida3); title('llave'); %
subplot(1,4,4); % Selecciona el 1 subplot
imshow(salida4); title('Destornillador'); %
%%
EJEX=ESTADISTICAS1(1).Centroid(2); %Guarda el dato de centroide x de la
figura 1
EJEY=ESTADISTICAS1(1).Centroid(1); %Guarda el dato de centroide y de la
figura 1
EJEX1=ESTADISTICAS2(1).Centroid(2); %Guarda el dato de centroide x de la
figura 1
EJEY1=ESTADISTICAS2(1).Centroid(1); %Guarda el dato de centroide y de la
figura 1
EJEX2=ESTADISTICAS3(1).Centroid(2); %Guarda el dato de centroide x de la
figura 1
EJEY2=ESTADISTICAS3(1).Centroid(1); %Guarda el dato de centroide y de la
figura 1
EJEX3=ESTADISTICAS4(1).Centroid(2); %Guarda el dato de centroide x de la
figura 1
EJEY3=ESTADISTICAS4(1).Centroid(1); %Guarda el dato de centroide y de la
figura 1
Area3=ESTADISTICAS3(1).Area;
Area4=ESTADISTICAS4(1).Area;
if (Area3<=Area4)
Ex3=EJEX2;
Ey3=EJEY2;
Ey2=EJEY3;
Ex2=EJEX3;
else
Ex3=EJEX3;
Ey3=EJEY3;
Ey2=EJEY2;
Ex2=EJEX2;
end
xt=[EJEX,EJEX1,Ex2,Ex3];% Se colocan todos los centroides x en un vector
yt=[EJEY,EJEY1,Ey2,Ey3];% se colocan todos los centroides y en un vector
str={'Fondo','ruido','Llave','Destornillador'}%se coloca el texto de cada
par de centroides
figure(6),imshow(RGB)
text(yt,xt,str) %Se aplica el comando text a la imagen RGB inicial
Figura 37: Resultado del código anterior.
Cuarta clase:
En esta cuarta clase se mostrara como capturar imágenes en tiempo real mediante el comando
imread(), el cual combinándolo con la aplicación ipwebcam
https://play.google.com/store/apps/details?id=com.pas.webcam&hl=es el cual se puede
descargar desde la play store de Android.
La combinación de estos dos comandos permite capturar fotos en tiempo real, para esto nos
disponemos a utilizar el siguiente comando de Matlab, el cual permite tomar solo 3 fotos en timpo
real:
for i=1:3
RGB=imread('http://192.168.1.5:8080/shot.jpg');
imshow(RGB)
pause(10)
end
Para tomar más fotos solo debemos aumentar el número tres de nuestro for al número que
queramos.
Esta es la aplicación que utilizaremos para realizar la respectiva captura de imagen en tiempo real.
Las ventajas de utilizar esta aplicación es que se puede instalar en cualquier teléfono Android y
convertirlo en un emisor de imágenes a bajo costo.
Una vez descargada e instalada la aplicación nos disponemos a abrirla e inicializar el servidor, el
cual nos da una dirección ip para cargar nuestra imagen.
Figura 37: Inicializar el servidor de nuestro aplicación ip webcam.
Con esta ip podremos capturar las imágenes en tiempo real de nuestr celular.
RGB=imread('http://192.168.1.5:8080/shot.jpg');
La cual colocaremos en el comando imread() como se muestra en el anterior código.
Ejercicio:
Código:
clc;clear all;
for i=1:3
RGB= imread('http://192.168.1.5:8080/shot.jpg'); %carga la imagen
[m n c]=size(RGB);
f1 = figure(1);, set(f1, 'color', 'w');, clf; % Crea Figura
subplot(1,4,1); % Selecciona el 1 subplot
imshow(RGB); title('Imagen Color'); % Visualiza imagen color
subplot(1,4,2); % Selecciona el 2 subplot
imshow(RGB(:,:,1)); title('Componente Rojo'); % Visualiza componente R
subplot(1,4,3); % Selecciona el 3 subplot
imshow(RGB(:,:,2)); title('Componente Verde'); % Visualiza componente G
subplot(1,4,4); % Selecciona el 4 subplot
imshow(RGB(:,:,3)); title('Componente Azul');
R=RGB(:,:,1); %Matriz Roja
G=RGB(:,:,2); %Matriz Verde
B=RGB(:,:,3); %Matriz Azul
b_b=im2bw(R,0.8); %Binarización de la matriz azul
figure(2)
imshow(b_b);
%% negacion y aplicacion del filtro
bwm1=bwareaopen(b_b,89999); % Aplicación del filtro
se = strel('disk',10); % Elemento estructurante
bwm1 = imclose(bwm1,se); % Operacion closing
bwm1=bwareaopen(bwm1,3050);%filtro paraeliminar valores menores a 10
pixeles
%
% for i=800:m
% for j = 1:n
% if(bwm1(i,j)==1) %Permite hallar solo la figura 1
% bwm1(i,j)=0;
% end
% end
% end
CC = bwconncomp(bwm1); %Comando para encontrar elementos en una imagen
binarizada
no=CC.NumObjects;
L = labelmatrix(CC);% crea etiquetas para realizar la caracterización
[m,n]=size(L);%Halla las filas y columnas de la matriz L
figure(3)
imshow(bwm1)
%%
primera=bwlabel(bwm1); %Se etiqueta la primera imagen para hallar sus
caracteristicas
ESTADISTICAS1= regionprops(primera,'all');%Halla las propiedas de la
imagen 1
f2 = figure(4);, set(f2, 'color', 'w');, clf; % Crea Figura
subplot(1,1,1); % Selecciona el 1 subplot
imshow(bwm1); title('raton'); %
%%
EJEX=ESTADISTICAS1(1).Centroid(2); %Guarda el dato de centroide x de la
figura 1
EJEY=ESTADISTICAS1(1).Centroid(1); %Guarda el dato de centroide y de la
figura 1
Quinta clase:
En esta quinta clase se mostrará como obtener los puntos de interés o características de una
imagen utilizando el Speeded-Up Robust Features o SURF, además de la identificación de un
objeto en una imagen determinada.
Figura 43: Imagen de referencia RGB con los puntos más relevantes.
Ademas se puede observar por separado cada uno de los puntos de interés como se observa en la
siguiente imagen:
Figura 44: 25 primeros puntos de interés de la imagen en RGB.
figure;
subplot(5,5,3); title('First 25 Features');
for i=1:25
scale = ref_pts(i).Scale;
image = imcrop(ref_img,[ref_pts(i).Location-10*scale 20*scale
20*scale]);
subplot(5,5,i);
imshow(image);
hold on;
rectangle('Position',[5*scale 5*scale 10*scale
10*scale],'Curvature',1,'EdgeColor','g');
end
Se puden observar los diferentes puntos por separado de la imagen en RGB estos puntos son
importantes para realizar la respectiva detección de la imagen en una imagen mas general.
Ahora tomamos una imagen mas general como la que sigue acontinuación:
Figura 45: Imagen general con la reina de picas.
Ahora se hallan los puntos coincidentes entre la imagen de referencia y la imagen general con el
siguiente código.
Imagen 47: Imagen con los supuestos puntos comunes entre la imagen de referencia y la imagen
general.
Ahora nos disponemos a hallar solamente los puntos coincidentes, para eso se utilizara el
siguiente código:
ref_inlier_pts = ref_matched_pts(inlierIdx,:);
I_inlier_pts = I_matched_pts(inlierIdx,:);
% Draw the lines to matched points
figure;showMatchedFeatures(image, ref_img, I_inlier_pts, ref_inlier_pts,
'montage');
title('Muestra solamente los puntos realmente coincidentes');
Figura 48: Todos los puntos coincidentes entre la imagen de referencia y la imagen general.
Ahora solo nos queda por detectar en la imagen general la de referencia utilizando el siguiente
código.
Con esto encontramos diferentes formas de detectar un objeto en una imagen general, teniendo
en cuenta que la imagen de referencia se toma aparte de la imagen general (la imagen de
referencia no es un recorte de la imagen general).
Sexta clase:
Para estas identificaciones se utilizará las funciones de MATLAB para visión artificial, la cual seria
bueno que cada persona las revisara en la casa (debido a que son muchas y el tiempo de clase se
iria en revisarlas todas).
Por ahora se comenzará con la identificación de cara por medio de imágenes anteriormente
tomadas, para el cual se tomarán las diferentes clases de la función “Visión” de MATLAB, las cuales
son:
vision.CascadeObjectDetector
Esta clase permite identificar rostros, naris, ojos, etc. Mediante la utilización del algoritmo
de Viola-Jaime. Cabe aclarar que este algortimo sirve únicamente caundo los rostros se
encuentran de forma frontal.
vision.ShapeInserter
Esta clase permite dibujar líneas, rectángulos, polígonos en una imagen determinada.
Ya con estos dos comandos se podrán realizar tareas de identificación de rostros tal como se
observa en la siguiente imagen.
Solo agregamos el comando anteriormente hablado tal como se muestra en el siguiente código.
I_faces = insertObjectAnnotation(I,'rectangle',bbox,'caras');
imshow(I_faces);
Código
%% Detecta el cuerpo superior de la imagen
% Crea un detector de objeto
bodyDetector = vision.CascadeObjectDetector('UpperBody');
bodyDetector.MinSize = [60 60];
bodyDetector.ScaleFactor = 1.05;
En algunas imágenes tendremos detecciones erradas (como se pudo observar con la de nariz y de
ojos), para eso es necesario aplicar un filtrado donde se obtiene solamente lo que necesitamos.
Figura 57: Supuestamente reconocimiento de rostros por MATLAB
Al aplicar el siguiente código se obtiene un resultado mucho mejor ya que realizamos un filtrado
de los diferentes rostros que tenemos en la imagen obteniendo única y exclusivamente las caras
de los personajes.
bbox_face = zeros(size(bbox_body));
for i=1:length(bbox_body)
Icrop = imcrop(I,bbox_body(i,:));
bbox = step(faceDetector,Icrop);
if ~isempty(bbox)
bbox_face(i,:) = bbox + [bbox_body(i,1:2)-1 0 0];
end
end
I_faces2 =
insertObjectAnnotation(I,'rectangle',bbox_face,1:size(bbox_face,1));
figure, imshow(I_faces2)
Figura 58: Detección final de los rostros de cada personaje.
Ahora adicionalmente se realizará el recorte de una imagen que se encontró por la detección de
carnet, como sigue a continuación.