Red de conocimiento informático - Conocimiento de la instalación - Ayuda: Análisis de los resultados de la transformada wavelet discreta implementado por opencv

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++)

{

// 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,

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>