Vous êtes sur la page 1sur 4

Segmentacin de color

Universidad Nacional de Colombia Diego Mauricio Rivera Pinzn dmriverap@unal.edu.co Visin de maquina

Resumen
En este documento se pretende mostrar cmo podemos segmentar imgenes en MatLab a partir de los colores de los objetos, en particular en el espacio RGB. Primero se har una introduccin a los conceptos necesarios y luego se aplicar la segmentacin a imgenes reales y sintticas. Palabras clave: Segmentacin de color, RGB.

I Introduccin Una de las labores de gran importancia en el procesamiento de imgenes es la segmentacin. 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 segmentacin de escenas naturales o en imgenes artificiales

Cada pixel podemos representarlo como la informacin de tres canales diferentes uno con la informacin 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 intencin al segmentar en color es separar objetos cuyos patrn 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 tambin las componentes de color que utilizamos como patrn. Al hacer esto nos encontramos con que aparece en muy pocos lugares un valor particular ya que la iluminacin 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 patrn (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 estn 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 dems.

Fig. 1, Representacin 3D en el espacio para RGB

Fig. 2, En la representacin 3D en el espacio para RGB, tomamos solo una pequea parte de cubo total.

II Desarrollo Para explicar el procedimiento vamos a emplear dos imgenes, una artificial mostrada en las figuras 3 y otra natural mostrada en la figura 4.

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). Despus 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 degradacin que pueda darse debido a las fuentes de luz o a las texturas, si tomamos un valor muy alto, prcticamente estarn pasando todos los colores por lo que la segmentacin podra dar malos resultados. Para escoger este valor lo recomendado es hacer un seguimiento emprico al mtodo hasta que encuentre resultados cercanos a lo que busca. Con respecto al pixel, vamos a obtener la informacin directamente de la imagen, apoyndonos en la instruccin de MatLab impixel, esta instruccin nos permite tomar la informacin de los componentes RGB de una imagen que este siendo visualizada. El cdigo para iniciar se presenta a continuacin.
im=imread('lain.jpg'); %definimos la tolerancia tol=30; % %creamos una figura para visualizar las %imgenes 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));

Fig. 3, Imagen lain.jpg

Una vez concluido lo anterior empezamos la segmentacin buscando los colores que estn dentro del intervalo definido por la informacin 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;

Fig. 4, Imagen chao.jpg

Terminamos el programa combinando la imagen original con los resultados obtenidos en la segmentacin.
seg=t; seg(:,:,2)=t; seg(:,:,3)=t; fin=uint8(double(seg).*double(im)); %graficamos la respuesta subplot(1,2,2) imshow(fin)

A continuacin se presenta una galera de imgenes 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 mayora de las imgenes obtenemos ruidos, estos se pueden eliminar utilizando tcnicas de morfologa de imgenes que se escapan a la intencin de este documento.

Fig. 8, Segmentacin de separar el cabello. T=20.

lain.jpg

buscando

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

Fig. 5, Segmentacin de separar el rostro. T=20.

lain.jpg

buscando

Fig. 10, Segmentacin de separar las flores. T=20.

chao.jpg

buscando

Fig. 6, Segmentacin de lain.jpg buscando separar en abrigo. T=20.

Fig. 7, Segmentacin separar el moo. T=20.

de

lain.jpg

buscando

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

Con lo visto anteriormente podemos implementar una funcin 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 segmentacin.
function y=colorseg(im,tol,pix) colrefR=double(pix(1,1)); colrefG=double(pix(1,2)); colrefB=double(pix(1,3)); R=im(:,:,1)>=(colrefRtol)&im(:,:,1)<=(colrefR+tol); G=im(:,:,2)>=(colrefGtol)&im(:,:,2)<=(colrefG+tol); B=im(:,:,3)>=(colrefBtol)&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 imgenes de escenas naturales se observa una gran cantidad de colores y de texturas, por lo tanto, debemos buscar tcnicas de segmentacin ms robustas para que las ligeras variaciones de color entre pxeles no sean un obstculo para segmentar completamente objetos de inters. Hay que tener en cuenta que la tolerancia que escojamos har que tengamos resultados aceptables o indeseados. Para mejorar el algoritmo se podra trabajar una tolerancia independiente para cada componente de color.

Referencias [1] Rafael C. Gonzlez y Richard E. Woods. Digital


Image Processing Using Matlab. Pearson Prentice Hall. 2004 [2] Arturo de la Escalera. Visin por Computador: Fundamentos y Mtodos. Prentice Hall. 2001.

Vous aimerez peut-être aussi