Sunday, September 26, 2010

Tip Octave

Cuando se carga una imagen en memoria usando imread se almacena como una matriz uint8, lo que significa que cada valor de la matriz es un número positivo de 1 byte, si se quiere trabajar con esos números hay que tener cuidado pues tomarán un valor máximo de 255.


octave:> img = imread("imagen.jpg");
octave:> img(1,1)
octave:> ans = 44
octave:> img(1,1)*1000
octave:> ans=255
octave:> %para evitar esto hay que hacer un casting
octave:> double(img(1,1))*1000
octave:> ans=44000
octave:>


Escribí esto aquí para que no se me olvide, pues me causó un gran dolor de cabeza mientras estaba probando un algoritmo de interpolación para un trabajo de la universidad.

Monday, September 20, 2010

Efecto para ser invisible, para variar en OpenCV

El efecto mostrado en el post anterior es muy fácil de programar:
1.- Sacar una foto al fondo
2.- Reemplazar todos los pixeles color piel por su pixel correspondiente en la imagen tomada en 1.
Para detectar la piel humana en el espacio de colores RGB:

char isSkinPixel(IplImage *img, int x, int y) {
unsigned char R,G,B;
B = img->imageData[y*img->widthStep+x*img->nChannels];
G = img->imageData[y*img->widthStep+x*img->nChannels+1];
R = img->imageData[y*img->widthStep+x*img->nChannels+2];
if( R > 95 && G > 40 && B > 20 && ( max(R,G,B) - min(R,G,B) ) > 15 && abs( (int)(R-G) ) > 15 && R>G && R>B ) {
return 1;
}
return 0; 
}

La condición que se usa para detectar el color piel la ví en un paper, pero no lo pude encontrar para dejarlo aquí.

La detección de piel humana funciona bien sólo si estamos capturando imágenes en un lugar con la luminosidad adecuada, pues si esta muy oscuro o muy iluminado el color de la piel se pierde. Además hay falsos positivos si el fondo no es el adecuado.

Código fuente del programa : invisible (necesita la biblioteca OpenCV)