jueves, 30 de septiembre de 2010

Clase rectángulo

Para poder tener todo un poco más ordenado me he creado una clase rectángulo.

Mis rectángulos se definen por la esquina de arriba a la izquierda, la esquina de abajo a la derecha, el color y un identificador.
Al crear un rectángulo se le pasan la posición de las esquinas, y el color y el identificador son opcionales, pudiendo ponerlos en otro momento. Las funciones para manejar estos atributos son las siguientes:

void setID(int i);
void setColor(CvScalar c);

CvPoint getEsquinaIA();
CvPoint getEsquinaDB();
CvScalar getColor();
int getID();



Después, como habrá que dibujar los rectángulos también me he puesto una función para que los dibuje:

IplImage* dibujar(IplImage* img);


Y por último, unas funciones para que me digan la posición del rectángulo (el punto central), la altura y la anchura del mismo:

CvPoint damePosicion ();
int dameAlto();
int dameAncho();


Para ver que funcionaba me he puesto a probar las diferentes funcionalidades en una foto, haciendo dos rectángulos.

martes, 28 de septiembre de 2010

Difuminando y eliminando ruido

He descubierto la función cvSmooth, con la que puedo aplicar diferentes tipos de transformaciones en la imagen, como estudié visión hace ya tiempo y me sonaba que el filtro gaussiano lo que hacía era difuminar la imagen y eliminar así el ruido he probado a ver que pasaba.




Como se puede ver, mi gozo en un pozo, porque la idea era que difuminando un poco la imagen pudiera eliminar el ruido, pero con esto no lo elimino, sino que hago que intente pasar desapercibido, que si mi aplicación tuviera un poco de miopía daría el pego, pero creo que no es el caso (aun lo estoy estudiando).


Así que he experimentado un poco más dentro de esa función y he encontrado el filtro "Median blur", que aplicado a mi imagen consigo esto:




¡Tachán! Es más parecido a lo que ando buscando, aunque hay ciertos puntos de ruidos que no elimina (nada es perfecto, por ahora).

Es un buen resultado el obtenido, pero como siempre se quiere más, ahora voy a ponerme a descubrir cómo era eso de disminuir y dilatar los píxeles, que tengo el presentimiento de que eso es lo que estoy buscando.

Añadiendo ruido

Usando la imagen que he obtenido antes de elegir el rojo le he añadido de forma aleatoria puntos con ruido.





Ahora lo que tengo que hacer es usar funciones de opencv para poder quitar ese ruido.

Umbralizando

Después de estar trasteando con ciertas funciones, ahora lo que quiero hacer es seleccionar de una imagen un color determinado, para poder luego trabajar con ello.
El color elegido al azar entre los tres colores importantes es el rojo, así que con una imagen sencilla en la que hay círculos me quedo con los rojos que son los más molones. El resultado es el siguiente:




Como se puede observar ha sido una elección óptima, pero claro, el mundo no es perfecto para estas cosas, así que ahora me dedicaré a meter ruido en la imagen para que sea un poco más real.

viernes, 10 de septiembre de 2010

Acceso por punteros

Esta vez he accedido a la imagen por medio de punteros de la siguiente manera:
v=((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels+k];

De esta forma se accede a todos los pixeles de la imagen uno a uno. Para probarlo la transformación que he hecho a la imagen es restar 125 si el valor del pixel es mayor a 125, y sumar 125 si el valor era menor a 125. El resultado final ha sido:



miércoles, 8 de septiembre de 2010

Negativando

He cogido una imagen y accediendo pixel por pixel con la función cvGet2D, después he mirado el valor del pixel para cambiarlo (si estaba a 0 lo he cambiado a 255 y si tenía 255 a 0), y después he metido los nuevos valores en otra imagen con la función cvSet2D.

Con ello el resultado obtenido es el negativo de una imagen en blanco y negro.




Ahora lo intentaré hacer con punteros.

martes, 7 de septiembre de 2010

Tratando imágenes

Transformaciones de una imagen con las funciones ya definidas en opencv.

La primera transformación es pasar una imagen a escala de grises, para ello la función que he usado ha sido cvCvtColor.


La siguiente tranformación es una binarización de los canales de la imagen, usando la función cvThreshold.


Y por último he juntado las dos funciones anteriores, primero pasando la imagen a escala de grises y luego haciendo una binarización de ésta.




Las siguientes transformaciones en la imagen las haré a mano, accediendo pixel por pixel.