Monografias.com > Computación
Descargar Imprimir Comentar Ver trabajos relacionados

Color y transformaciones lineales en OpenCV




Enviado por Pablo Turmero



Partes: 1, 2


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

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

    Monografias.com
    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.

    Monografias.com
    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.

    Monografias.com
    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???.

    Monografias.com
    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.

    Monografias.com
    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

    Monografias.com
    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

    Monografias.com
    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.

    Monografias.com
    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 

    Nota al lector: es posible que esta página no contenga todos los componentes del trabajo original (pies de página, avanzadas formulas matemáticas, esquemas o tablas complejas, etc.). Recuerde que para ver el trabajo en su versión original completa, puede descargarlo desde el menú superior.

    Todos los documentos disponibles en este sitio expresan los puntos de vista de sus respectivos autores y no de Monografias.com. El objetivo de Monografias.com es poner el conocimiento a disposición de toda su comunidad. Queda bajo la responsabilidad de cada lector el eventual uso que se le de a esta información. Asimismo, es obligatoria la cita del autor del contenido y de Monografias.com como fuentes de información.

    Categorias
    Newsletter