Descargar

Color y transformaciones lineales en OpenCV (página 2)

Enviado por Pablo Turmero


Partes: 1, 2
edu.red Es conveniente definirse funciones para empaquetar/ desempaquetar imágenes en este formato. Por ejemplo, de formato RCPack2D a formato Fase/Magnitud.

Transformada Discreta de Fourier: void cvDFT (const CvArr* src, CvArr* dst, CV_DXT_FORWARD | CV_DXT_SCALE) Transformar la imagen src (en el dominio espacial) en la dst (dominio frecuencial). Usar imágenes de 1 canal y profundidad real, es decir, 32F o 64F. También se puede usar profundidad compleja. El resultado estará en formato RCPack2D. La llamada usa el algoritmo O(n·log n) de FFT. Usar el OR de las dos constantes

edu.red Transformada Discreta Inversa de Fourier: void cvDFT (const CvArr* src, CvArr* dst, CV_DXT_INVERSE) Transformar la imagen src (en el dominio frecuencial) en la dst (dominio espacial), es decir, la transformación inversa a la DFT. Aquí no se pone el flag para escalar. Igual que antes, las imágenes deben ser de 1 canal y profundidad 32F o 64F.

Ejemplo. Dada una imagen img (de 8 bits y 1 canal), la imagen sal resultante del siguiente código será la misma.

IplImage* img32= cvCreateImage(cvGetSize(img), IPL_DEPTH_32F, 1); IplImage* fft= cvCreateImage(cvGetSize(img), IPL_DEPTH_32F, 1); IplImage* sal= cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1); cvScale(img, img32); cvDFT(img32, fft, CV_DXT_FORWARD | CV_DXT_SCALE); cvDFT(fft, img32, CV_DXT_INVERSE); cvScale(img32, sal);

edu.red La transformada del coseno, DCT, no tiene problemas de representación, porque sólo usa números reales. Transformada Discreta del Coseno: void cvDCT (const CvArr* src, CvArr* dst, CV_DXT_FORWARD) Dada la imagen src (en el dominio espacial) obtienen la transformada del coseno en dst. Igual que con la cvDFT, La función cvDCT es restrictiva en los tipos y profundidades admitidos: imágenes de 1 canal y profundidad real. Para hallar la magnitud, podemos usar la función cvAbs. Transformada Discreta Inversa del Coseno: void cvDCT (const CvArr* src, CvArr* dst, CV_DXT_INVERSE) Dada la imagen src obtienen la transformada inversa del coseno en dst.

edu.red Ejemplo 1. Dada una imagen img, calcular el espectro (magnitud de la DFT, sin centrar) en la imagen res. IplImage *img32= cvCreateImage(cvGetSize(img), IPL_DEPTH_32F, 1); IplImage *fft= cvCreateImage(cvGetSize(img), IPL_DEPTH_32F, 1); IplImage *espectro= cvCreateImage(cvGetSize(img), IPL_DEPTH_32F, 1); cvScale(img, img32); cvDFT(img32, fft, CV_DXT_FORWARD); ggmComplexToMagnitud(fft, espectro); IplImage *res= cvCloneImage(img); cvConvertScale(espectro, res, -1.0/150.0, 255); cvReleaseImage(&img32); cvReleaseImage(&fft); cvReleaseImage(&espectro); Donde tenemos definidas las funciones: void ggmReimToMag (IplImage *ent, int x1, int y1, int x2, int y2, IplImage *sal, int x, int y, int xc= -1, int yc= -1) { CvScalar pf1= cvGet2D(ent, y1, x1); CvScalar pf2= x2>=0 ? cvGet2D(ent, y2, x2) : cvScalarAll(0); for (int i= 0; i<3; i++) pf1.val[i]= sqrt(pf1.val[i]*pf1.val[i]+pf2.val[i]*pf2.val[i]); cvSet2D(sal, y, x, pf1); if (xc>=0) cvSet2D(sal, yc, xc, pf1); }

edu.red void ggmComplexToMagnitud (IplImage *ent, IplImage *sal) { int ancho= ent->width, ancho2= (ancho%2 ? ancho-1 : ancho-2); int alto= ent->height, alto2= (alto%2 ? alto-1 : alto-2); int x, y; ggmReimToMag(ent, 0, 0, -1, -1, sal, 0, 0); for (y= 1; y<3; i++) suma.val[i]= color.val[i] – media.val[i]; cvAddS(img, suma, img);

Partes: 1, 2
 Página anterior Volver al principio del trabajoPágina siguiente