當前位置:編程學習大全網 - 編程語言 - 求助:opencv實現的離散小波變換結果分析

求助:opencv實現的離散小波變換結果分析

代碼如下:

// DWT.cpp : 定義控制臺應用程序的入口點。

//

#include "stdafx.h"

#include "cv.h"

#include "highgui.h"

// 二維離散小波變換(單通道浮點圖像)

void DWT(IplImage *pImage, int nLayer)

{

// 執行條件

if (pImage)

{

if (pImage->nChannels == 1 &&

pImage->depth == IPL_DEPTH_32F &&

((pImage->width >> nLayer) << nLayer) == pImage->width &&

((pImage->height >> nLayer) << nLayer) == pImage->height)

{

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 = new float[pImage->width];

float *pColumn = new float[pImage->height];

for (i = 0; i < pImage->height; i++)

{

pData[i] = (float*) (pImage->imageData + pImage->widthStep * i);

}

// 多層小波變換

for (n = 0; n < nLayer; n++, nWidth /= 2, nHeight /= 2, nHalfW /= 2, nHalfH /= 2)

{

// 水平變換

for (y = 0; y < nHeight; y++)

{

// 奇偶分離

memcpy(pRow, pData[y], sizeof(float) * nWidth);

for (i = 0; i < nHalfW; i++)

{

x = i * 2;

pData[y][i] = pRow[x];

pData[y][nHalfW + i] = pRow[x + 1];

}

// 提升小波變換

for (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;

}

// 頻帶系數

for (i = 0; i < nHalfW; i++)

{

pData[y][i] *= fRadius;

pData[y][nHalfW + i] /= fRadius;

}

}

// 垂直變換

for (x = 0; x < nWidth; x++)

{

// 奇偶分離

for (i = 0; i < nHalfH; i++)

{

y = i * 2;

pColumn[i] = pData[y][x];

pColumn[nHalfH + i] = pData[y + 1][x];

}

for (i = 0; i < nHeight; i++)

{

pData[i][x] = pColumn[i];

}

// 提升小波變換

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;

}

// 頻帶系數

for (i = 0; i < nHalfH; i++)

{

pData[i][x] *= fRadius;

pData[nHalfH + i][x] /= fRadius;

}

}

}

delete[] pData;

delete[] pRow;

delete[] pColumn;

}

}

}

int _tmain(int argc, _TCHAR* argv[])

{

// 小波變換層數

int nLayer = 2;

// 輸入彩色圖像

IplImage *pSrc = cvLoadImage("lena.jpg", 1);

// 計算小波圖象大小,使其width和height都是2的倍數

CvSize size = cvGetSize(pSrc);

if ((pSrc->width >> nLayer) << nLayer != pSrc->width)

{

size.width = ((pSrc->width >> nLayer) + 1) << nLayer;

}

if ((pSrc->height >> nLayer) << nLayer != pSrc->height)

{

size.height = ((pSrc->height >> nLayer) + 1) << nLayer;

}

// 創建小波圖象

IplImage *pWavelet = cvCreateImage(size, IPL_DEPTH_32F, pSrc->nChannels);

if (pWavelet)

{

// 小波圖象賦值

cvSetImageROI(pWavelet, cvRect(0, 0, pSrc->width, pSrc->height));

cvConvertScale(pSrc, pWavelet, 1, -128);//使用線性變換轉換數組:pWavelet = pSrc*1-128

cvResetImageROI(pWavelet);

// 彩色圖像小波變換

IplImage *pImage = cvCreateImage(cvGetSize(pWavelet), IPL_DEPTH_32F, 1);

if (pImage)

{

for (int i = 1; i <= pWavelet->nChannels; i++)

{

cvSetImageCOI(pWavelet, i);//設置感興趣通道channel

cvCopy(pWavelet, pImage, NULL);//pImage為灰度圖像,將pWavelet的每個通道數據copy到pImage中

// 二維離散小波變換

DWT(pImage, nLayer);//對每個通道進行DWT

// 二維離散小波恢復

// IDWT(pImage, nLayer);

cvCopy(pImage, pWavelet, NULL);//將每個通道變換後的數據存入pWavelet的對應通道中

}

cvSetImageCOI(pWavelet, 0);

cvReleaseImage(&pImage);

}

// 小波變換圖象

cvSetImageROI(pWavelet, cvRect(0, 0, pSrc->width, pSrc->height));

cvConvertScale(pWavelet, pSrc, 1, 128);

cvResetImageROI(pWavelet); // 本行代碼有點多余,但有利用養成良好的編程習慣

cvReleaseImage(&pWavelet);

}

// 顯示圖像pSrc

cvNamedWindow("dwt",1);

cvShowImage("dwt",pSrc);

cvWaitKey(0);

cvDestroyWindow("dwt");

// ...

cvReleaseImage(&pSrc);

cvReleaseImage(&pSrc0);

return 0;

}

  • 上一篇:照片中的彩虹怎麽弄?照片裏的彩虹怎麽弄?
  • 下一篇:そら 天空「鐵腕巴蒂 」OP 平假名歌詞
  • copyright 2024編程學習大全網