Contar el número de figuras en una imagen

beruby - te devolvemos dinero por tus compras y reservas online
En este apartado vamos a aprender como contar el numero de figuras que aparecen en una imagen mediante Matlab:

Para ello utilizaremos una imagen que contiene un conjunto de cuadrados que leeremos mediante el comando 'imread'.A continuación se pasa la imagen a valores en binario con el comando 'im2bw' y posteriormente se pasan los objetos a contar a blanco y el fondo en negro solo si no están ya de esa forma mediante el comando 'not'. Por último con bwlabel etiquetamos cada objeto que se encuentra con números consecutivos 1,2,3.... y basta con encontrar el máximo elemento de Im_label para encontrar el numero de figuras que aparecen en la imagen.

Código:

clear all
im_rgb=imread('contarcuadrados.jpg','jpg');
figure(),imshow(im_rgb)
Im_bin=im2bw(im_rgb,0.5)
imshow(Im_bin)
Im_bin=not(Im_bin);
figure(),imshow(Im_bin)
Im_label=bwlabel(Im_bin,8);
n=max(max(Im_label))


Resultados:
Imagen original

Imagen preparada para contar el número de cuadrados

 Si ejecutamos el código nos devuelve el numero de figuras en la imagen n=6 que corresponden al numero de figuras que se observan.


Dilatar imagenes con matlab

En este apartado aprenderemos como dilatar imágenes mediante Matlab, es decir, agrandar los bordes de las figuras que aparecen en una imagen.

Para ello vamos a crear una imagen con unos cuantos cuadrados en su interior, posteriormente pasamos la señal definida en RGB a una señal definida en escala de grises. Posteriormente detecto los bordes de la imagen como explico en el apartado 'Detección de los bordes de una imagen'.
Una vez que se han detectado los bordes de la imagen, simplemente mediante la orden 'imdilate', dilato los bordes detectados que se corresponden con la figura seleccionada mediante la sentencia 'strel'.

Código:

se=strel('square',30);%selecciono las figuras que quiero dilatar(círculos,triángulos,cuadrados....)
im_rgb=imread('cuadrados.jpg');
figure(),imshow(im_rgb)
im_gray=rgb2gray(im_rgb);%cambio la señal en color a una señal en escala de grises
im_edge=edge(im_gray,'sobel');%detecto los bordes de los cuadrados de la figura
im_dilate=imdilate(im_edge,se);%dilata la figura seleccionada en se
figure(),imshow(im_edge);
figure(),imshow(im_dilate)


 Resultados:
Imagen de los cuadrados que equivale en este caso a la de detección de bordes
 Imagen con los bordes de los cuadrados dilatados
 Entrada principal

Deteccion de los bordes de una imagen

En este apartado vamos a aprender como se pueden detectar los bordes de una imagen mediante la herramienta Matlab:

Para ello leeremos la imagen mediante el comando 'imread' y posteriormente la representaremos para ver nuestra imagen original y poder compararla con la detección de bordes que realizaremos posteriormente. A continuación pasamos la imagen en color obtenida a una imagen representada en una escala de grises. Por último mediante el uso del comando'edge' detectamos los bordes de la imagen en blanco y negro y la representamos:

Código:

im_rgb=imread('Pinguinos.jpg');
figure(),imshow(im_rgb)
im_gray=rgb2gray(im_rgb);%pasa la imagen en color a una imagen en escala de grises.

figure(),imshow(im_gray)
bordesimagen=edge(im_gray,'canny');%realiza la detección de los bordes en una imagen
figure(),imshow(bordesimagen)


Resultados:


Imagen original
Imagen en escala de grises
Imagen con la detección de bordes
 
Entrada principal

Imagen transmitida por un canal y recuperada

En este apartado vamos a simular el envío y recepción de una imagen que transmitimos por un canal:

Para ello en Matlab,obtenemos una imagen, que seria la que vamos a enviar por el canal, le agregamos ruido que representaría la transmisión de la imagen por el canal y por ultimo filtraremos la imagen para poder recuperar la señal de la forma mas similar a la señal enviada:

Codigo:
 foto=imread('imagen.png');%obtenemos la señal
 figure,imshow(uint8(foto))
 foto=imnoise(foto,'salt & pepper');%añadimos ruido a la señal
 foto_R=foto(:,:,1);
 foto_G=foto(:,:,2);
 foto_B=foto(:,:,3);
 foto1(:,:,1)=foto_R;
 foto1(:,:,2)=foto_G;
 foto1(:,:,3)=foto_B;
 figure,imshow(uint8(foto1))
 filtro=1/9*[1 1 1;1 1 1;1 1 1];%creamos el filtro para poder recuperar la señal
 foto2_R=filter2(filtro,double(foto_R));%filtramos cada componente de la señal
 foto2_G=filter2(filtro,double(foto_G));
 foto2_B=filter2(filtro,double(foto_B));
 foto2(:,:,1)=foto2_R;
 foto2(:,:,2)=foto2_G;
 foto2(:,:,3)=foto2_B;
 imshow(uint8(foto))
 figure,imshow(uint8(foto2))

Resultados:
Primero representamos la señal enviada por el canal:
A continuación, añadimos ruido a la señal que simularía la transmisión de la imagen obteniendo:
Como vemos la imagen a perdido bastante calidad por lo que procedemos a aplicar el filtro:
Al convolucionar la señal con el filtro se obtiene la imagen representada anteriormente donde vemos que mejora un poco la calidad de la señal


Submuestrear una imagen

  • Submuestrear una imagen por un factor

Ejemplo1:
       Explicación:
Para poder trabajar con una señal, muchas veces necesitamos disminuir el numero de valores para que no se nos sature la memoria, por lo que es necesario submuestrear la imagen. Para ello simplemente basta con

        Código:

imagen=imread('imagen.png')% obtenemos la imagen
a=2%factor de muestreo
b=4%segundo factor de muestreo
imagen_sub= imagen(1:a:end,1:a:end,1:1:end)
imagen_sub2= imagen(1:b:end,1:b:end,1:1:end)

figure(1),imshow(imagen);%representamos la imagen sin original
figure(2),imshow(imagen_sub);%representamos la imagen submuestreada un factor 2
figure(3),imshow(imagen_sub2);%representamos la imagen submuestreada un factor 4


        Resultados:
Como vemos en las 3 imágenes siguientes, el submuestrear la señal no solo tiene ventajas como disminuir el numero de valores con el que trabajamos, sino que tiene una gran desventaja que es que disminuimos mucho la calidad de la imagen(ya que como vemos el tamaño de la imagen al submuestrear con un factor a=2 o b=4 disminuye 2 o 4 veces respectivamente si lo comparamos con el de la señal original), por lo que siempre debemos intentar trabajar con el mayor numero de muestras posible:
Entrada principal

Transformación de imágenes de color a diversos tipos

beruby - te devolvemos dinero por tus compras y reservas online
En este apartado vamos a aprender como cambiar la imagen que leemos en color a diversos tipos como son en escala de grises o en blanco y negro. También representaremos las componentes R,G Y B  de la imagen en color:

Código:
clear all
image=imread('pinguinos.jpg');% obtenemos la imagen
       
        % imagen tal y como la obtenemos
        figure(1)
        subplot(2,3,1)
        imshow(image),title(sprintf('Imagen original'));

        % Componente roja de la imagen
        image_R(:,:,1)=image(:,:,1);
        image_R(:,:,2)=0;
        image_R(:,:,3)=0;
        subplot(2,3,2)
        imshow(image_R),title(sprintf('Imagen componente roja'));

        % Componente verde de la imagen
        image_G(:,:,2)=image(:,:,2);
        image_G(:,:,1)=0;      
        image_G(:,:,3)=0;
        subplot(2,3,3)
        imshow(image_G),title(sprintf('Imagen componente verde'));

        % Componente azul de la imagen
        image_B(:,:,3)=image(:,:,3);
        image_B(:,:,1)=0;
        image_B(:,:,2)=0;
        subplot(2,3,4)
        imshow(image_B),title(sprintf('Imagen componente azul'));
       
        % Imagen en blanco y negro
        image_BW=im2bw(image,0.5);
        subplot(2,3,5)
        imshow(image_BW),title(sprintf('Imagen blanco y negro'));

        % Imagen en escala de grises
        image_Gray=rgb2gray(image);
        subplot(2,3,6)
        imshow(image_Gray),title(sprintf('Imagen escala grises'));

Resultados:
-Como vemos las componentes de la señal en color se obtienen simplemente obteniendo cada una de las matrices que representan cada una de las componentes del color y haciendo las demás matrices nulas, es decir, si por ejemplo queremos representar la componente roja de la imagen de color, lo que hacemos es introducir en una nueva matriz de 3 dimensiones (m,n,3) ( al igual que la señal de color), las filas y columnas de la primera componente de la señal de color (m,n,1) en la componente 1 de nuestra nueva matriz e introducir todo ceros en las otras 2 componentes de la nueva matriz (m,n,2 y m,n,3).
-Para pasar la imagen en color a una imagen en blanco y negro, usamos el comando im2bw.
-Para pasar la imagen en color a una imagen en escala de grises, usamos el comando rgb2gray que lo que hace es simplemente la operación en una nueva matriz de dos dimensiones: image_Gray=image(:,:,1) *0.3 + image(:,:,2) * 0.59 + image(:,:,3)* 0.1.
Entrada principal