Descargar

Color y transformaciones lineales en OpenCV

Enviado por Pablo Turmero


Partes: 1, 2

    edu.red Color y transformacioneslineales en OpenCV Espacios de color Otras operaciones con color Transformaciones lineales DFT y DCT

    edu.red Tipos de operaciones: Espacios de color: cvCvtColor Otras operaciones con color: cvFloodFill Transformaciones lineales: cvDFT, cvDCT

    edu.red Espacios de color: OpenCV incluyen operaciones para cambiar el modelo de color de una imagen: RGB (BGR), XYZ, HSV, HLS, Lab, Luv, YCrCb, GRAY El control del color no es riguroso. Las imágenes tienen atributos colorModel y channelSeq, que deberían indicar el modelo de color de la imagen y el orden de los canales. Pero en la práctica no se usan. En OpenCV, las imágenes por defecto se almacenan en el orden BGR (no en RGB). Recordar también las funciones relacionadas con histogramas (anexo A.2): cvCreateHist, cvReleaseHist, cvCalcHist.

    edu.red El modo normal de trabajo será: Transformar la imagen de RGB al espacio ???. Operar en el espacio ???. Transformar el resultado de ??? a RGB. Opcionalmente, se pueden separar los canales para trabajar con ellos independientemente (cvSplit) y luego juntarlos (cvMerge). Todas las transformaciones entre espacios son siempre a través de RGB. Por ejemplo, para convertir de HSV a XYZ habrá que hacer: convertir de HSV a RGB + convertir de RGB a XYZ. Ojo, cada vez que se convierte el espacio se puede perder un poco de calidad (por los redondeos de los cálculos). Recordar: no se almacena en RGB sino en BGR.

    edu.red Conversión de color en OpenCV: void cvCvtColor (const CvArr* src, CvArr* dst, int code) Transforma la imagen src en dst, según la operación dada en code. Deben tener el mismo tamaño y nº de canales adecuado. code: CV_BGR2XYZ, CV_RGB2XYZ, CV_XYZ2BGR, CV_XYZ2RGB, CV_BGR2YCrCb, CV_RGB2YCrCb, CV_YCrCb2BGR, CV_YCrCb2RGB, CV_BGR2HSV, CV_RGB2HSV, CV_HSV2BGR, CV_HSV2RGB, CV_BGR2HLS, CV_RGB2HLS, CV_HLS2BGR, CV_HLS2RGB, CV_BGR2Lab, CV_RGB2Lab, CV_Lab2BGR, CV_Lab2RGB, CV_BGR2Luv, CV_RGB2Luv, CV_Luv2BGR, CV_Luv2RGB,CV_BGR2GRAY, CV_GRAY2BGR No tiene en cuenta los atributos colorModel y channelSeq. Hay que indicar correctamente el orden de los canales. Normalmente el RGB se almacena como BGR ? En lugar de usar CV_RGB2???, usar CV_BGR2???.

    edu.red Rellenado de color: void cvFloodFill (CvArr* img, CvPoint seed, CvScalar newVal, CvScalar lo=0, CvScalar up=0, CvConnectedComp* comp=NULL, int flags=4, CvArr* mask=NULL) Rellenar la imagen img con el color newVal, partiendo del punto seed. comp contiene información de la región rellenada (número de píxeles, rectángulo contenedor, valor medio). Se puede descartar pasando en valor NULL. flags indica el modo de rellenado. Cada grupo de bits indica una cosa (combinar con OR). Los 3 menos significativos indican la conectividad de la vecindad: 4 u 8. Los más significativos se activan con: CV_FLOODFILL_FIXED_RANGE y CV_FLOODFILL_MASK_ONLY.

    edu.red Rellenado de color: CV_FLOODFILL_FIXED_RANGE: rango fijo. La diferencia es respecto al punto seed. Si no se pone, el rango es flotante (diferencia respecto al píxel adyacente rellenado). CV_FLOODFILL_MASK_ONLY: sólo máscara. Si se activa, sólo se modifica la máscara, mask, pero no la imagen. En la máscara, se ponen a 255 los píxeles rellenados. Ojo, la máscara se puede usar como entrada (si existe una máscara, sólo se rellenan píxeles donde la máscara valga 0), y como salida (en el modo “mask only”). Medida de distancia (en rango fijo): si el píxel seed vale (r, g, b), el píxel rellenado debe estar en el rango:(r-lo.r…r+up.r ; g-lo.g…g+up.g ; b-lo.b…b+up.b) Igual en modo rango flotante. Ver el programa de ejemplo: OpenCVsamplescffilldemo.c

    edu.red Otras operaciones con color: Para hacer modificaciones de color, se pueden usar las operaciones globales y locales (ver anexos A.2 y A.3) de forma independiente por canal. Ejemplo. Colorear img con “un poco” de color rojo. cvAddS(img, CV_RGB(45, 0, 0), img); Otra operación interesante: cvAvg, obtener la media de todos los píxeles de una imagen, por canales (por ejemplo, para hacer balance de blancos). Ojo a la suma módulo 180 de la página 43. Hay que: Convertir la imagen a 16S con escala: 255.0/180.0 Hacer la suma en 16S Hacer un AND con 0xFF (equivalente a calcular módulo 256) Convertir a 8U con escala: 180.0/255.0

    edu.red Transformaciones lineales: OpenCV incluye dos tipos de transformaciones lineales y sus correspondientes inversas: DFT y DCT. Las funciones de OpenCV son restrictivas en cuanto a profundidad y número de canales. Funciones de OpenCV: cvDFT, cvDCT. Las imágenes resultantes pueden estar escaladas o no (divididas por el número de píxeles de la imagen). Es mejor escalar en la DFT directa (no escalar en la inversa). Recordar que la DFT usa números complejos y es semi-simétrica. Esto da lugar a un formato especial de almacenamiento, conocido como el formato empaquetado RCPack2D.

    edu.red Formato empaquetado RCPack2D: se usa para las imágenes en el dominio de DFT. Una IplImage Y de NxM almacena una imagen compleja de la siguiente forma: Re Y0,0 Re Y0,1 Im Y0,1 Re Y0,2 Im Y0,2 … Re Y0,N/2-1 Im Y0,N/2-1 Re Y0,N/2 Re Y1,0 Re Y1,1 Im Y1,1 Re Y1,2 Im Y1,2 … Re Y1,N/2-1 Im Y1,N/2-1 Re Y1,N/2 Im Y2,0 Re Y2,1 Im Y2,1 Re Y2,2 Im Y2,2 … Re Y2,N/2-1 Im Y2,N/2-1 Im Y2,N/2 …………………………………………………………………………………………………………………… Re YM/2-1,0 Re YM-3,1 Im YM-3,1 Re YM-3,2 Im YM-3,2… Re YM-3,N/2-1 Im YM-3,N/2-1 Re YM-3,N/2 Im YM/2-1,0 Re YM-2,1 Im YM-2,1 Re YM-2,2 Im YM-2,2… Re YM-2,N/2-1 Im YM-2,N/2-1 Im YM-2,N/2 Re YM/2,0 Re YM-1,1 Im YM-1,1 Re YM-1,2 Im YM-1,2… Re YM-1,N/2-1 Im YM-1,N/2-1 Im YM-1,N/2 Observar: Algunos píxeles sólo tienen parte real, por ejemplo, el (0,0). La última columna sólo se usa si N es par, y la última fila si M es par. Las filas sólo llegan hasta N/2 porque la imagen es semi-simétrica: Y(a,b) es el conjugado de Y(W-a, H-b).

    Partes: 1, 2
    Página siguiente