Vous êtes sur la page 1sur 6

Interpolacin de imgenes

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

Resumen
La interpolacin es el proceso en el cual se calculan valores numricos desconocidos a partir de otros ya conocidos, para esto se aplican algoritmos concretos. Para esto existe gran variedad de formas y mtodos diferentes, todos con el objetivo comn de conservar la nitidez en los detalles de la imagen inicial. An as, los resultados de la ampliacin varan considerablemente en funcin del tamao del software, nitidez y algoritmo de interpolacin aplicado. Palabras clave: Interpolacin de imgenes, mosaico de Bayer, MatLab.

I Introduccin Para crear una imagen digital a color utilizamos un arreglo matricial en el que incluimos una parte debida al color rojo, una al verde y otra al azul, Es decir para cada pixel de informacin necesitamos conocer el valor de 3 canales de color asociados a ste. Sin embargo, por razones tcnicas, la inmensa mayora de los sensores de cmaras digitales son monocromos. Es habitual que para capturar la informacin de color, delante del sensor se ubica un filtro que consiste en una retcula de filtros de colores (CFA, Color Filter Array) rojo, verde y azules, que hace que ciertos pxeles del sensor capten informacin sobre la componente verde de la imagen, otros sobre la roja, y otros sobre la azul. Es decir, la informacin que obtenemos en cada pixel no es de las tres componentes de color, solo de una. En este caso, nos falta gran parte de la informacin, y tendremos que usar ciertos criterios para reconstruir el total de la informacin utilizando tcnicas de interpolacin. 1

Una de las configuraciones ms populares de CFAs en las cmaras digitales es el llamado mosaico de Bayer, donde la disposicin espacial de los filtros de color se refleja en la figura 1. Como podemos observar, la mitad de los pixeles del sensor dan informacin del canal verde (G), una cuarta parte del canal rojo (R), y la otra cuarta parte del canal azul (B) (Fig. 2). La mayor importancia asignada al verde se debe a que es la longitud de onda a la que el ojo humano es ms sensible. Vale la pena recalcar que solo tenemos un tercio de la informacin total de la imagen, por lo tanto hay que tener muy buen criterio para conseguir los datos faltantes.

Fig. 1,

Arreglo de Bayer.

Fig. 2, Separacin de los canales R G y B.

II Desarrollo Para estudiar la interpolacin de los datos desde un sensor de Bayer, tenemos una rutina en MatLab denominada rgb2bayer, que recibe una imagen RGB (matriz de AltoAncho3) y devuelve la misma imagen RGB, pero en los valores no captados por el filtro de Bayer que son la mitad de los verdes, y tres cuartas partes de los rojos y azules se han cambiado por NaN (Not a Number), se escoge NaN en lugar del cero, para que no se preste a confusiones en las regiones que son muy oscuras. La funcin rgb2bayer se presenta a continuacin, recuerde guardar el siguiente juego de instrucciones con nombre de rgb2bayer.m y que en el momento de utilizar la funcin, el archivo este en la misma carpeta en la que est trabajando MatLab (Current Directory).
function bayer=rgb2bayer(imagen,align) %Convierte una imagen RGB a un mosaico de %Bayer % %'imagen' es debe ser uint8 rgb %align representa el orden de los datos de la esquina %superios izquierda. % %Diego M Rivera 2009 % [x y z]=size(imagen); imagen=im2double(imagen); switch align case 'gbrg' caso=[1 3;1 2;2 3;1 3]; case 'grbg' caso=[1 3;2 3;1 2;1 3]; case 'bggr' caso=[1 2;1 3;1 3;2 3]; case 'rggb' caso=[2 3;1 3;1 3;1 2]; end for f=1:x for c=1:y pos=(2*mod(f+1,2)+mod(c+1,2))+1; imagen(f,c,caso(pos,:))=NaN; end end bayer=imagen;

Fig. 3, formas de alineacin en la esquina superior izquierda del mosaico de Bayer

Veamos un ejemplo de aplicacin de rgb2bayer.


imagen=imread('horses.jpg'); imshow(imagen) pause(5) bayer=rgb2bayer(imagen,'rggb'); imshow(bayer);

Con esta rutina cargamos una imagen que debe estar previamente guardada en la carpeta de trabajo de MatLab (Current Directory), la visualizamos durante 5 segundos y luego la convertimos de RGB a Bayer. El resultado obtenido se visualiza en las figuras 4 y 5.

Fig. 4, imagen Horses.jpg

Antes de utilizar la funcin hay que aclarar el termino align el cual se refiere a la alineacin en la esquina superior izquierda de la imagen. En la figura 3 podemos visualizar las 4 posibles configuraciones de colores que podemos obtener.

Fig. 5, Horses.jpg despus de aplicarle la funcin rgb2bayer

Para entender mejor el resultado de la figura 5, vamos a hacer un zoom a la cabeza del caballo blanco y a mostrarlo en la figura 6.

Vamos a interpolar el canal G de la respuesta a la funcin rgb2bayer (Fig. 8), para eso podemos utilizar las siguientes instrucciones en MatLab
imagen=imread('horses.jpg'); bayer=rgb2bayer(imagen,'rggb'); % for f=2:tam(1)-1 for c=2:tam(2)-1 if isnan(green(f,c))==1 green(f,c)=(green(f-1,c)+ green(f+1,c)+ green(f,c-1)+ green(f,c+1))/4; end end end % % imshow(green)

Fig. 6, Horses.jpg despus de aplicarle la funcin rgb2bayer y haciendo un zoom sobre la cabeza del caballo blanco.

Una vez entendida la estructura del mosaico de Bayer vamos a iniciar la interpolacin, es decir Se trata ahora de conseguir los valores que faltan (NaN) de cada canal. Como sabemos, hay muchos tipos de interpolaciones posibles. La ms sencilla es la llamada vecino ms prximo (orden 0) y consiste en replicar cada muestra conocida en los huecos ubicados a un costado. Tambin est la interpolacin lineal (orden 1) que es un poco ms elaborada, donde las muestras intermedias se disponen en la recta que une a los puntos ya conocidos. En el canal Verde para valor perdido (NaN) tenemos cuatro valores adyacentes conocidos (arriba, abajo, derecha, izquierda). El valor del canal verde en cada pixel central se podra calcular como la media de esos cuatro vecinos. A esto se le conoce como interpolacin bilineal.

Fig. 8, imagen Horses.jpg, solo se visualiza del canal G una seccin de la imagen total.

Con el conjunto anterior de instrucciones estamos reconstruyendo la imagen total, ya que con el ciclo for y el condicional if estamos recorriendo toda la matriz buscando donde faltan valores, es decir, donde hay vacios de informacin y una vez encontrados se rellena cada uno con el promedio de los 4 vecinos. El resultado obtenido se visualiza en la figura 9. Podemos conseguir el mismo resultado si utilizamos la instruccin imfilter de MatLab para esto tenemos que definir una mscara M. El resultado obtenido con imfilter es idntico al de interpolar con el ciclo for.

Fig. 7, canal G, cada valor desconocido tiene 4 vecinos con valores conocidos. En este caso hay que interpolar la mitad de los valores de la matriz.

Fig. 11, duplicacin del tamao de una imagen, el tipo de interpolacin es similar a la del mosaico de Bayer para los canales R y B.

Fig. 9, imagen Horses.jpg, se visualiza el canal G interpolado, esta es una seccin de la imagen total.

imagen=imread('horses.jpg'); bayer=rgb2bayer(imagen,'rggb'); % % se pasa a uint8 porque la imagen viene en % Formato double G=uint8(255*bayer(:,:,2)); % se define la mascara M= [0 1 0; 1 0 1; 0 1 0]/4; G_inter= G + imfilter(G,M); % imshow(G_inter)

Comencemos con la interpolacin del canal R y el mtodo se anlisis se podr aplicar igual al canal B. primero podemos considerar el caso en el que los vacios de informacin tienen en las diagonales cuatro datos que son conocidos, podemos obtener el valor del pixel como el promedio de estos vecinos, hay que tener en cuenta el diseo de la mscara [1] para que cumpla con estas especificaciones. = 0.25 0 0.25 0 0 0 0.25 0 0.25 [1]

Una vez interpolado el canal G pasamos a interpolar los canales R y B. Las condiciones del canal rojo son idnticas a las del canal azul. Veamos que podemos encontrarnos tres casos desde la perspectiva de los vacios de informacin: dos vecinos uno arriba y uno abajo, dos vecinos a los lados o cuatro vecinos en las esquinas. Este caso de interpolacin tiene caractersticas similares a las de la duplicacin de tamao de imgenes (Figura 11).

Una vez tengamos esta parte de la interpolacin, el modo de organizacin de la matriz R resultante ser similar al del canal G que se obtiene del filtro Bayer, por lo tanto el siguiente paso ser aplicarle el mismo tratamiento a la matriz y terminaremos el proceso. El cdigo en MatLab para interpolar el canal R es presentado a continuacin en el cual primero se visualiza el canal R como se obtiene de la funcin de Bayer, luego se interpolan los vacios que tengan cuatro vecinos conocidos y luego el resto, vale la pena destacar que este cdigo nos servir tambin para interpolar imgenes que estemos duplicando de tamao.
imagen=imread('horses.jpg'); bayer=rgb2bayer(imagen,'rggb'); % R=uint8(255*bayer(:,:,1)); M1= [1 0 1; 0 0 0; 1 0 1]/4; R1 = imfilter(R,M1); % M2=[0 1 0; 1 0 1; 0 1 0]/4; R2 = imfilter(R+R1,M2); R_inter = R + R1 + R2;

Fig. 10, canales R y B. En estos casos hay que interpolar tres cuartas partes de los valores de la matriz.

% %Ver el canal R en Bayer imshow(R) pause(2) %Ver el canal interpolando los que tengan 4 %vecinos diagonales imshow(R+R1) pause(2) %ver el resultado de la interpolacin imshow(R_inter)

favorecer la interpolacin a lo largo de los bordes, en vez de a travs de los bordes.

Uniendo lo visto anteriormente podemos presentar una funcin en MatLab que cumpla el papel de interpolar un mosaico de Bayer y dejarlo en formato RGB.
function imagen=bayer2rgb(bayer) %Toma una imagen mosaico de Bayer y la interpola %sin importar el tipo de alineacin % %Diego M Rivera 2009 % R=uint8(255*bayer(:,:,1)); G=uint8(255*bayer(:,:,2)); B=uint8(255*bayer(:,:,3)); % interpolar el rojo R1 = imfilter(R,[1 0 1; 0 0 0; 1 0 1]/4); %rojo en los puntos azules R2 = imfilter(R+R1,[0 1 0; 1 0 1; 0 1 0]/4); ReCons = R + R1 + R2; %interpolar el verde ReCons(:,:,2)=G+imfilter(G, [0 1 0; 1 0 1; 0 1 0]/4); %interpolar el Azul B1 = imfilter(B,[1 0 1; 0 0 0; 1 0 1]/4); %azul en los puntos rojos B2 = imfilter(B+B1,[0 1 0; 1 0 1; 0 1 0]/4); ReCons(:,:,3)= B + B1 + B2; imagen=ReCons;

Fig. 12, Resultado de la interpolacin.

El resultado de la interpolacin es presentado en la figura 12. El error cuadrtico medio obtenido entre la imagen original y el mosaico de Bayer es 0.287 y entre la imagen original y la interpolacin es de 0.0147. Pero esta es solo una forma de interpolacin, existen tcnicas ms robustas como el filtrado adaptativo. Un filtrado adaptativo se aplica de forma distinta segn las condiciones de la imagen. En nuestro caso cambiaremos la regla de interpolacin en funcin de una sencilla estimacin de bordes en el canal original, para 5

Fig. 13, zoom para comparar la imagen original (arriba) y la imagen interpolada (abajo).

Fig. 14, Vecindad de un pixel G.

En la figura 14 se muestra la vecindad de un pixel a interpolar en el canal verde. Al tratarse de un mtodo adaptativo, la regla para obtener el valor de G va a depender las caractersticas de ese punto, en particular de una estimacin que hacemos del gradiente (derivadas) del canal en las direcciones vertical Gy = |G1 G4| y horizontal Gx = |G3 G2|. Si Gx es significativamente mayor que Gy eso indica que existe posiblemente un borde vertical en ese punto, por lo que el valor a interpolar se define como la media de G4 y G1 (en sentido vertical para no promediar a travs del borde). Si por el contrario, Gy es mayor que Gx, tendremos un borde horizontal, y promediaremos G2 y G3. Si ambas derivadas son similares, consideraremos que no hay un borde y promediamos los cuatro vecinos. III conclusiones Es importante tener en cuenta que la interpolacin de una fotografa a un tamao concreto (con dicha informacin desconocida) nunca conseguira la misma calidad de una fotografa realizada al mismo tamao, ya que en este ltimo caso la informacin es real y no inventada. Utilizando tcnicas adaptativas en lugar de mtodos lineales podemos disminuir el error cuadrtico medio. Referencias [1] Rafael C. Gonzalez 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