segmentación de color con matlab

4
1 Segmentación de color Universidad Nacional de Colombia Diego Mauricio Rivera Pinzón [email protected] Visión de maquina Resumen En este documento se pretende mostrar cómo podemos segmentar imágenes en MatLab a partir de los colores de los objetos, en particular en el espacio RGB. Primero se hará una introducción a los conceptos necesarios y luego se aplicar la segmentación a imágenes reales y sintéticas. Palabras clave: Segmentación de color, RGB. I Introducción Una de las labores de gran importancia en el procesamiento de imágenes es la segmentación. Debido a que un objeto puede ser caracterizado por sus propiedades de color, textura y forma, podemos usar al color como elemento discriminante entre objetos para realizar una segmentación de escenas naturales o en imágenes artificiales Fig. 1, Representación 3D en el espacio para RGB Cada pixel podemos representarlo como la información de tres canales diferentes uno con la información relacionada con el rojo, otro con el verde y otro con el azul. Considerando lo anterior, podemos representar cada pixel como un vector con 3 componentes RGB y representarlo en el espacio 3D (figura1). La intención al segmentar en color es separar objetos cuyos patrón de color sea uniforme, es decir aislar regiones que tengan el mismo color, para eso vamos a utilizar un algoritmo muy sencillo pero que en ciertas circunstancias nos permite buenos resultados. Si queremos encontrar un color presente en una imagen basta con revisar en cuales pixeles se hallan también las componentes de color que utilizamos como patrón. Al hacer esto nos encontramos con que aparece en muy pocos lugares un valor particular ya que la iluminación y el tipo de textura hacen que un color no este esparcido uniformemente, para solucionar este inconveniente vamos a usar una ventana que nos dé un margen de tolerancia con respecto al color que utilicemos como patrón (figura 2). Por ejemplo, si estamos interesados en encontrar el color especifico R=200, G=150 y B=100, vamos a buscar en la imagen todos los colores que estén dentro de un margen de tolerancia T, es decir vamos a buscar en el componente de color rojo un intervalo de (200-T) < R < (200+T), para el verde buscamos en (150-T) < G < (150+T), y para el azul (100-T) < B < (100+T), si T fuera 10, el intervalo para el rojo seria 190< R<210 y así con todos los demás.

Upload: ernesto-ezequiel-lamby-delgado

Post on 22-Jan-2018

1.890 views

Category:

Engineering


0 download

TRANSCRIPT

Page 1: Segmentación de Color con MATLAB

1

Segmentación de color

Universidad Nacional de Colombia Diego Mauricio Rivera Pinzón

[email protected] Visión de maquina

Resumen

En este documento se pretende mostrar cómo podemos segmentar imágenes en MatLab a partir de los colores de los objetos, en particular en el espacio RGB. Primero se hará una introducción a los conceptos necesarios y luego se aplicar la segmentación a imágenes reales y sintéticas. Palabras clave: Segmentación de color, RGB.

I Introducción

Una de las labores de gran importancia en el procesamiento de imágenes es la segmentación. Debido a que un objeto puede ser caracterizado por sus propiedades de color, textura y forma, podemos usar al color como elemento discriminante entre objetos para realizar una segmentación de escenas naturales o en imágenes artificiales

Fig. 1, Representación 3D en el espacio para RGB

Cada pixel podemos representarlo como la información de tres canales diferentes uno con la información relacionada con el rojo, otro con el verde y otro con el azul. Considerando lo anterior, podemos representar cada pixel como un vector con 3 componentes RGB y representarlo en el espacio 3D (figura1). La intención al segmentar en color es separar objetos cuyos patrón de color sea uniforme, es decir aislar regiones que tengan el mismo color, para eso vamos a utilizar un algoritmo muy sencillo pero que en ciertas circunstancias nos permite buenos resultados.

Si queremos encontrar un color presente en una

imagen basta con revisar en cuales pixeles se hallan también las componentes de color que utilizamos como patrón. Al hacer esto nos encontramos con que aparece en muy pocos lugares un valor particular ya que la iluminación y el tipo de textura hacen que un color no este esparcido uniformemente, para solucionar este inconveniente vamos a usar una ventana que nos dé un margen de tolerancia con respecto al color que utilicemos como patrón (figura 2). Por ejemplo, si estamos interesados en encontrar el color especifico R=200, G=150 y B=100, vamos a buscar en la imagen todos los colores que estén dentro de un margen de tolerancia T, es decir vamos a buscar en el componente de color rojo un intervalo de (200-T) < R < (200+T), para el verde buscamos en (150-T) < G < (150+T), y para el azul (100-T) < B < (100+T), si T fuera 10, el intervalo para el rojo seria 190< R<210 y así con todos los demás.

Page 2: Segmentación de Color con MATLAB

2

Fig. 2, En la representación 3D en el espacio para RGB, tomamos solo una pequeña parte de cubo total.

II Desarrollo

Para explicar el procedimiento vamos a emplear dos imágenes, una artificial mostrada en las figuras 3 y otra natural mostrada en la figura 4.

Fig. 3, Imagen lain.jpg

Fig. 4, Imagen chao.jpg

Lo primero que tenemos que hacer es cargar la imagen en el Workspace, tenga en cuenta que debe dar la ruta completa de la imagen si ésta no se encuentra en la misma carpeta en la que esté trabajando MatLab (current directory). Después tenemos que definir dos cosas, primero la tolerancia y segundo que color en particular estamos buscando. Para la tolerancia T vamos a escoger un valor entre 0 y 255. Si tomamos T=0, quiere decir que estamos buscando un color en particular sin tener en cuenta la degradación que pueda darse debido a las fuentes de luz o a las texturas, si tomamos un valor muy alto, prácticamente estarán pasando todos los colores por lo que la segmentación podría dar malos resultados. Para escoger este valor lo recomendado es hacer un seguimiento empírico al método hasta que encuentre resultados cercanos a lo que busca. Con respecto al pixel, vamos a obtener la información directamente de la imagen, apoyándonos en la instrucción de MatLab impixel, esta instrucción nos permite tomar la información de los componentes RGB de una imagen que este siendo visualizada. El código para iniciar se presenta a continuación.

im=imread('lain.jpg'); %definimos la tolerancia tol=30; % %creamos una figura para visualizar las %imágenes figure subplot(1,2,1) imshow(im) % %tomamos una muestra de color de la imagen que %está siendo mostrada pix=impixel; % %definimos los colores de referencia colrefR=double(pix(1,1)); colrefG=double(pix(1,2)); colrefB=double(pix(1,3));

Una vez concluido lo anterior empezamos la segmentación buscando los colores que estén dentro del intervalo definido por la información del pixel de muestra y la tolerancia que escogimos. Para esto utilizamos las siguientes instrucciones.

%Encontramos los colores dentro del intervalo R=im(:,:,1)>=(colrefR-tol)&im(:,:,1)<=(colrefR+tol); G=im(:,:,2)>=(colrefG-tol)&im(:,:,2)<=(colrefG+tol); B=im(:,:,3)>=(colrefB-tol)&im(:,:,3)<=(colrefB+tol); %el resultado es una matriz binaria con 1 donde está el color buscado y 0 donde no t=R&G&B;

Page 3: Segmentación de Color con MATLAB

3

Terminamos el programa combinando la imagen original con los resultados obtenidos en la segmentación.

seg=t; seg(:,:,2)=t; seg(:,:,3)=t; fin=uint8(double(seg).*double(im)); %graficamos la respuesta subplot(1,2,2) imshow(fin)

A continuación se presenta una galería de

imágenes con los resultados obtenidos en lain.jpg (figuras 5 a 8) y en chao.jpg (figuras 9 a 11). En cada una se describe que tolerancia se utilizó en cada caso. La figura 11 muestra resultados no deseados por utilizar un margen de tolerancia muy alto. Otro detalle a destacar es que en la mayoría de las imágenes obtenemos ruidos, estos se pueden eliminar utilizando técnicas de morfología de imágenes que se escapan a la intención de este documento.

Fig. 5, Segmentación de lain.jpg buscando separar el rostro. T=20.

Fig. 6, Segmentación de lain.jpg buscando separar en abrigo. T=20.

Fig. 7, Segmentación de lain.jpg buscando separar el moño. T=20.

Fig. 8, Segmentación de lain.jpg buscando separar el cabello. T=20.

Fig. 9, Segmentación de chao.jpg buscando separar los elementos azules de la ropa. T=40.

Fig. 10, Segmentación de chao.jpg buscando separar las flores. T=20.

Fig. 11, Segmentación de chao.jpg buscando separar las flores, observamos malos resultados por utilizar un margen de tolerancia muy alto. T=80.

Page 4: Segmentación de Color con MATLAB

4

Con lo visto anteriormente podemos implementar una función en MatLab que nos permita segmentar una imagen en color si le damos un pixel de referencia y una tolerancia, es decir, el ancho de la ventana de segmentación.

function y=colorseg(im,tol,pix) colrefR=double(pix(1,1)); colrefG=double(pix(1,2)); colrefB=double(pix(1,3)); R=im(:,:,1)>=(colrefR-tol)&im(:,:,1)<=(colrefR+tol); G=im(:,:,2)>=(colrefG-tol)&im(:,:,2)<=(colrefG+tol); B=im(:,:,3)>=(colrefB-tol)&im(:,:,3)<=(colrefB+tol); t=R&G&B; seg=t; seg(:,:,2)=t; seg(:,:,3)=t; y=uint8(double(seg).*double(im));

III conclusiones

En las imágenes de escenas naturales se observa una gran cantidad de colores y de texturas, por lo tanto, debemos buscar técnicas de segmentación más robustas para que las ligeras variaciones de color entre píxeles no sean un obstáculo para segmentar completamente objetos de interés. Hay que tener en cuenta que la tolerancia que escojamos hará que tengamos resultados aceptables o indeseados. Para mejorar el algoritmo se podría trabajar una tolerancia independiente para cada componente de color.

Referencias

[1] Rafael C. González y Richard E. Woods. Digital Image Processing Using Matlab. Pearson Prentice Hall. 2004

[2] Arturo de la Escalera. Visión por Computador: Fundamentos y Métodos. Prentice Hall. 2001.