Interpol Ac I On Bayer

Interpolación de imágenes Universidad Nacional de Colombia Diego Mauricio Rivera Pinzón [email protected] Visión de

Views 142 Downloads 3 File size 396KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

Interpolación de imágenes Universidad Nacional de Colombia Diego Mauricio Rivera Pinzón [email protected] Visión de maquina

Resumen Una de las configuraciones más populares de CFAs en las cámaras digitales es el llamado mosaico de Bayer, donde la disposición espacial de los filtros de color se refleja en la figura 1. Como podemos observar, la mitad de los pixeles del sensor dan información 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 más sensible. Vale la pena recalcar que solo tenemos un tercio de la información total de la imagen, por lo tanto hay que tener muy buen criterio para conseguir los datos faltantes.

La interpolación es el proceso en el cual se calculan valores numéricos desconocidos a partir de otros ya conocidos, para esto se aplican algoritmos concretos. Para esto existe gran variedad de formas y métodos diferentes, todos con el objetivo común de conservar la nitidez en los detalles de la imagen inicial. Aún así, los resultados de la ampliación varían considerablemente en función del tamaño del software, nitidez y algoritmo de interpolación aplicado. Palabras clave: Interpolación de imágenes, mosaico de Bayer, MatLab.

I Introducción 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 información necesitamos conocer el valor de 3 canales de color asociados a éste. Sin embargo, por razones técnicas, la inmensa mayoría de los sensores de cámaras digitales son monocromos. Es habitual que para capturar la información de color, delante del sensor se ubica un filtro que consiste en una retícula de filtros de colores (CFA, Color Filter Array) rojo, verde y azules, que hace que ciertos píxeles del sensor capten información sobre la componente verde de la imagen, otros sobre la roja, y otros sobre la azul. Es decir, la información 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 información, y tendremos que usar ciertos criterios para reconstruir el total de la información utilizando técnicas de interpolación.

Fig. 1,

Arreglo de Bayer.

Fig. 2, Separación de los canales R G y B.

1

II Desarrollo Para estudiar la interpolación de los datos desde un sensor de Bayer, tenemos una rutina en MatLab denominada rgb2bayer, que recibe una imagen RGB (matriz de Alto×Ancho×3) 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.

Fig. 3, formas de alineación en la esquina superior izquierda del mosaico de Bayer

Veamos un ejemplo de aplicación de rgb2bayer. imagen=imread('horses.jpg'); imshow(imagen) pause(5) bayer=rgb2bayer(imagen,'rggb'); imshow(bayer);

La función rgb2bayer se presenta a continuación, recuerde guardar el siguiente juego de instrucciones con nombre de rgb2bayer.m y que en el momento de utilizar la función, el archivo este en la misma carpeta en la que esté trabajando MatLab (Current Directory).

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.

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. 4, imagen ‘Horses.jpg’

Antes de utilizar la función hay que aclarar el termino align el cual se refiere a la alineación 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 después de aplicarle la función rgb2bayer

2

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 función 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 después de aplicarle la función rgb2bayer y haciendo un zoom sobre la cabeza del caballo blanco.

Una vez entendida la estructura del mosaico de Bayer vamos a iniciar la interpolación, es decir Se trata ahora de conseguir los valores que faltan (NaN) de cada canal. Como sabemos, hay muchos tipos de interpolaciones posibles. La más sencilla es la llamada “vecino más próximo” (orden 0) y consiste en replicar cada muestra conocida en los huecos ubicados a un costado. También está la interpolación “lineal” (orden 1) que es un poco más elaborada, donde las muestras intermedias se disponen en la recta que une a los puntos ya conocidos.

Fig. 8, imagen “Horses.jpg”, solo se visualiza del canal G una sección 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 información y una vez encontrados se rellena cada uno con el promedio de los 4 vecinos. El resultado obtenido se visualiza en la figura 9.

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 podría calcular como la media de esos cuatro vecinos. A esto se le conoce como interpolación bilineal.

Podemos conseguir el mismo resultado si utilizamos la instrucción imfilter de MatLab para esto tenemos que definir una máscara M. El resultado obtenido con imfilter es idéntico 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.

3

Fig. 11, duplicación del tamaño de una imagen, el tipo de interpolación es similar a la del mosaico de Bayer para los canales R y B.

Comencemos con la interpolación del canal R y el método se análisis se podrá aplicar igual al canal B. primero podemos considerar el caso en el que los vacios de información 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 diseño de la máscara [1] para que cumpla con estas especificaciones.

Fig. 9, imagen “Horses.jpg”, se visualiza el canal G interpolado, esta es una sección 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)

=

0.25 0 0.25 0 0 0 0.25 0 0.25

[1]

Una vez tengamos esta parte de la interpolación, el modo de organización 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 código en MatLab para interpolar el canal R es presentado a continuación en el cual primero se visualiza el canal R como se obtiene de la función de Bayer, luego se interpolan los vacios que tengan cuatro vecinos conocidos y luego el resto, vale la pena destacar que este código nos servirá también para interpolar imágenes que estemos duplicando de tamaño.

Una vez interpolado el canal G pasamos a interpolar los canales R y B. Las condiciones del canal rojo son idénticas a las del canal azul. Veamos que podemos encontrarnos tres casos desde la perspectiva de los vacios de información: dos vecinos uno arriba y uno abajo, dos vecinos a los lados o cuatro vecinos en las esquinas. Este caso de interpolación tiene características similares a las de la duplicación de tamaño de imágenes (Figura 11).

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.

4

% %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 interpolación imshow(R_inter)

favorecer la interpolación a lo largo de los bordes, en vez de a través de los bordes.

Uniendo lo visto anteriormente podemos presentar una función 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 alineación % %Diego M Rivera 2009 % R=uint8(255*bayer(:,:,1)); G=uint8(255*bayer(:,:,2)); B=uint8(255*bayer(:,:,3));

Fig. 12, Resultado de la interpolación.

% 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;

El resultado de la interpolación es presentado en la figura 12. El error cuadrático medio obtenido entre la imagen original y el mosaico de Bayer es 0.287 y entre la imagen original y la interpolación es de 0.0147. Pero esta es solo una forma de interpolación, existen técnicas más robustas como el filtrado adaptativo. Un filtrado adaptativo se aplica de forma distinta según las condiciones de la imagen. En nuestro caso cambiaremos la regla de interpolación en función de una sencilla estimación de bordes en el canal original, para

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

5

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 método adaptativo, la regla para obtener el valor de G va a depender las características de ese punto, en particular de una estimación 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 través 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 interpolación de una fotografía a un tamaño concreto (con dicha información desconocida) nunca conseguiría la misma calidad de una fotografía realizada al mismo tamaño, ya que en este último caso la información es real y no inventada. Utilizando técnicas adaptativas en lugar de métodos lineales podemos disminuir el error cuadrático medio. Referencias [1] Rafael C. Gonzalez 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.

6