Ayuda: Análisis de los resultados de la transformada wavelet discreta implementado por opencv
El código es el siguiente:
// DWT.cpp: Define el punto de entrada de la aplicación de consola.
//
#include "stdafx.h"
#include "cv.h"
#include "highgui.h "
// Transformada wavelet discreta bidimensional (imagen de punto flotante de un solo canal)
void DWT(IplImage *pImage, int nLayer)
{
//Condición de ejecución
if (pImage)
{
if (pImage->nChannels == 1 &&
pImage->profundidad == IPL_DEPTH_32F &&
((pImage->ancho >> nLayer) << nLayer) == pImage->ancho &&
((pImage- >altura >> nLayer) << nLayer) == pImagen->altura)
{
int i, x, y, n;
float fValue = 0 ;
float fRadius = sqrt(2.0f);
int nWidth = pImage->width;
int nHeight = pImage->height;
int nHalfW = nWidth / 2;
int nHalfH = nHeight / 2;
float **pData = new float*[pImage->height];
float *pRow = nuevo float[pImage->ancho];
float *pColumn = nuevo float[pImage->alto];
for (i = 0; i < pImage->altura; i++)
{
pData[i] = (float*) (pImage->imageData + pImage->widthStep * i);
}
//Transformación wavelet multicapa
para (n = 0; n < nLayer; n++, nWidth /= 2, nHeight /= 2, nHalfW /= 2, nHalfH /= 2)
{
// Transformación horizontal
para (y = 0; y < nHeight; y++) p>
{
// Separación de paridad
memcpy(pRow, pData[y], sizeof(float) * nWidth);
for ( i = 0 ; i < nHalfW; i++)
{
x = i * 2;
pData[y][i] = pRow[x] ;
p>pData[y][nHalfW + i] = pRow[x + 1];
}
// Transformada wavelet de elevación
para (i = 0; i < nHalfW - 1; i++)
{
>fValue = (pData[y][i] + pData[y][i + 1]) / 2;
pData[y][nHalfW + i] -= fValue;
}
fValue = (pData[y][nHalfW - 1] + pData[y][nHalfW - 2]) / 2;
pData[y][nWidth - 1] -= fValue;
fValue = (pData[y][nHalfW] + pData[y][nHalfW + 1]) / 4;
pData[y][0 ] += fValue;
for (i = 1; i < nHalfW; i++)
{
fValue = (pData[y][nHalfW + i ] + pData[y][nHalfW + i - 1]) / 4;
pData[y][i] += fValue;
}
// Coeficiente de banda
for (i = 0; i < nHalfW; i++)
{
pData[y][i] *= fRadius;
pData[y][nHalfW + i] /= fRadius;
}
}
// Transformación vertical
for (x = 0; x < nWidth; x++)
{
// Separación par e impar
for (i = 0; i < nHalfH ; i++)
{
y = i * 2;
pColumna[i] = pDatos[y][x];
pColumna[nHalfH + i] = pDatos[y + 1][x];
}
for (i = 0; i < nAltura; i++)
{
pData[i][x] = pColumn[i];
}
// Transformada wavelet de elevación
for (i = 0; i < nHalfH - 1; i++)
{
fValue = (pData[i][x] + pData[i + 1][x ]) / 2;
pData[nHalfH + i][x] -= fValue;
}
fValue = (pData[nHalfH - 1][ x] + pData[nHalfH - 2][x]) / 2;
pData[nHeight - 1][x] -= fValue;
fValue = (pData[nHalfH] [x ] + pData[nHalfH + 1][x]) / 4;
pData[0][x] += fValue;
for (i = 1; i < nHalfH; i++)
{
fValue = (pData[nHalfH + i][x] + pData[nHalfH + i - 1][x]) / 4;
pData[i][x] += fValue;
}
// Coeficiente de banda
para (i = 0; i < nHalfH ; i++ )
{
pDatos[i][x] *= fRadio;
>
pData[nHalfH + i][x] /= fRadius;
}
}
}
eliminar[ ] pData;
eliminar[] pRow;
eliminar[] pColumna;
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
//Número de capas de transformación wavelet
int nLayer = 2;
//Ingresar imagen en color
IplImage *pSrc = cvLoadImage("lena.jpg", 1);
// Calcular imagen wavelet Tamaño de modo que el ancho y el alto sean múltiplos de 2
CvSize size = cvGetSize(pSrc);
if ((pSrc->width >> nLayer) << nLayer != pSrc- >ancho)
{
tamaño.ancho = ((pSrc->ancho >> nCapa) + 1) << nCapa;
}
if ((pSrc->altura >> nLayer) << nLayer != pSrc->altura)
{
tamaño.altura = ((pSrc- >altura >> nLayer) + 1) << nLayer;
}
// Crear imagen wavelet
IplImage *pWavelet = cvCreateImage(size, IPL_DEPTH_32F , pSrc- >nChannels);
if (pWavelet)
{
// Asignación de imagen Wavelet
cvSetImageROI(pWavelet, cvRect(0, 0, pSrc->width, pSrc->height));
cvConvertScale(pSrc, pWavelet, 1, -128);//Utilice transformación lineal para convertir la matriz: pWavelet = pSrc*1 -128
cvResetImageROI(pWavelet);
// Transformada wavelet de imagen en color
IplImage *pImage = cvCreateImage(cvGetSize(pWavelet), IPL_DEPTH_32F, ); p>
if (pImage)
{
for (int i = 1; i <= pWavelet->nChannels; i++)
{
cvSetImageCOI(pWavelet, i);//Establezca el canal de interés
cvCopy(pWavelet, pImage, NULL);//pImage es una imagen en escala de grises y cada pWavelet copia los datos del canal a pImage
// Transformada wavelet discreta bidimensional
DWT(pImage, nLayer);//Realizar DWT en cada canal
// Bidimensional recuperación de wavelet discreta
// IDWT(pImage, nLayer);
cvCopy(
pImage, pWavelet, NULL);//Guarda los datos transformados de cada canal en el canal correspondiente de pWavelet
}
cvSetImageCOI(pWavelet, 0);
cvReleaseImage(&pImage);
}
//Imagen de transformación Wavelet
cvSetImageROI(pWavelet, cvRect(0, 0, pSrc->width, pSrc- >height));
cvConvertScale(pWavelet, pSrc, 1, 128);
cvResetImageROI(pWavelet); // Esta línea de código es un poco redundante, pero es útil Desarrolla buenos hábitos de programación
cvReleaseImage(&pWavelet);
}
// Mostrar imagen pSrc
cvNamedWindow("dwt", 1 );
cvShowImage("dwt",pSrc);
cvWaitKey(0);
cvDestroyWindow("dwt");
// ...
cvReleaseImage(&pSrc);
cvReleaseImage(&pSrc0);
return 0;
}< / p>