jueves, 10 de junio de 2010

Segmentación de una imagen

Lo que se va a realizar a continuación es la identificación de objetos y determinar las propiedades de los mismos:

Primero se va a adquirir una imagen que contenga objetos redondos, debido a que la identificación de objetos seran mediante propiedades propias de dichos objetos.

image_or=imread('moneda.jpg');
figure; imshow(image_or);










Ahora se va a crear una imagen con una intensidad de escala de grises a partir de la imagen a color RGB, mediante el comando rgb2gray()
image=rgb2gray(image_or);
figure; imshow(image)










Se crea un elemento 'disk', es decir en forma de disco, y se lo hace para preservar la naturaleza circular del objeto.
En este caso se va a especificar un radio de 88 pixeles para llenar la cámara mas grande.
se=strel('disk',88);

Se procede a ejecutar la operación close en la imagen, que servirá para detectar el fondo de la imagen propuesta
closeBW=imclose(image,se);

Para identificar los objetos, se restan las dos matrices, es decir la matriz a escala de grises y la matriz que identifica el fondo de la imagen.
iden=imsubtract(closeBW,image);
figure; imshow(iden)











Con graythresh() se logra calcular el umbral que podrá ser utilizado para convertir una intensidad de imagena una imagen binaria utilizando im2bw
level=graythresh(iden);
intensidad=level*255

Binarizar imagen
BW=im2bw(iden,level);
figure; imshow(BW)






Se llena los agujeros de la imagen binaria BW.
fill=imfill(BX,'holes');
figure; imshow(fill)










Para identificar a cada objeto, como por ejemplo el número de objetos conectados, encontrados en la imagen BW.
[niveles, num]=bwlabel(BW,8);
num

Stats es una matrizcon longitud igual al número de objetos en la imagen binaria.
Con regionprops determina las propiedades de cada objeto conectado en la imagen binaria.
stats=regionprops(niveles,'Eccentricity','Area','BoundingBox');
Eccentricity: el valor está entre 1 y 0. Si la excentricidad es 0 se trata de un círculo, y si la excentricidad es 1 se trata de un segmento lineal.
Area: el número real de pixeles en la región.
BoundingBox: el más pequeño rectángulo que contiene la región.
areas=[stats.Area]
excentricidad=[stats.Eccentrincity]









3 comentarios:

  1. La segmentación de imágenes es un tema interesante ya que no solo nos ayuda a detectar los objetos conectados existentes en una imagen, sino que tambien nos ayuda a determinar las propiedades que dichos objetos tenga.

    ResponderEliminar
  2. Con este método podemos visualizar el fondo de la imagen desapareciendo los objetos, como también realizar el conteo de los objetos existentes en la imagen y sabiendo el área de cada círculo poder identificar cada moneda para así llegar a saber cuanto de dinero existe en la imagen.

    ResponderEliminar
  3. Toca corregir este paso:
    Se llena los agujeros de la imagen binaria BW.
    fill=imfill(BX,'holes');
    no es BX, sino BW
    fill=imfill(BW,'holes');

    ResponderEliminar