?? fretrans.cpp
字號(hào):
int wp; int hp; // 圖像每行的字節(jié)數(shù) LONG lLineBytes; // 計(jì)算圖像每行的字節(jié)數(shù) lLineBytes = WIDTHBYTES(lWidth * 8); // 賦初值 w = 1; h = 1; wp = 0; hp = 0; // 計(jì)算進(jìn)行離散余弦變換的寬度和高度(2的整數(shù)次方) while(w * 2 <= lWidth) { w *= 2; wp++; } while(h * 2 <= lHeight) { h *= 2; hp++; } // 分配內(nèi)存 double *f = new double[w * h]; double *F = new double[w * h]; // 行 for(i = 0; i < h; i++) { // 列 for(j = 0; j < w; j++) { // 指向DIB第i行,第j個(gè)象素的指針 lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j; // 給時(shí)域賦值 f[j + i * w] = *(lpSrc); } } for(i = 0; i < h; i++) { // 對(duì)y方向進(jìn)行離散余弦變換 DCT(&f[w * i], &F[w * i], wp); } // 保存計(jì)算結(jié)果 for(i = 0; i < h; i++) { for(j = 0; j < w; j++) { f[j * h + i] = F[j + w * i]; } } for(j = 0; j < w; j++) { // 對(duì)x方向進(jìn)行離散余弦變換 DCT(&f[j * h], &F[j * h], hp); } // 行 for(i = 0; i < h; i++) { // 列 for(j = 0; j < w; j++) { // 計(jì)算頻譜 dTemp = fabs(F[j*h+i]); // 判斷是否超過255 if (dTemp > 255) { // 對(duì)于超過的,直接設(shè)置為255 dTemp = 255; } // 指向DIB第y行,第x個(gè)象素的指針 lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j; // 更新源圖像 * (lpSrc) = (BYTE)(dTemp); } } // 釋放內(nèi)存 delete f; delete F; // 返回 return TRUE;}/************************************************************************* * * 函數(shù)名稱: * WALSH() * * 參數(shù): * double * f - 指向時(shí)域值的指針 * double * F - 指向頻域值的指針 * r -2的冪數(shù) * * 返回值: * 無。 * * 說明: * 該函數(shù)用來實(shí)現(xiàn)快速沃爾什-哈達(dá)瑪變換。 * ************************************************************************/VOID WINAPI WALSH(double *f, double *F, int r){ // 沃爾什-哈達(dá)瑪變換點(diǎn)數(shù) LONG count; // 循環(huán)變量 int i,j,k; // 中間變量 int bfsize,p; double *X1,*X2,*X; // 計(jì)算快速沃爾什變換點(diǎn)數(shù) count = 1 << r; // 分配運(yùn)算所需的數(shù)組 X1 = new double[count]; X2 = new double[count]; // 將時(shí)域點(diǎn)寫入數(shù)組X1 memcpy(X1, f, sizeof(double) * count); // 蝶形運(yùn)算 for(k = 0; k < r; k++) { for(j = 0; j < 1<<k; j++) { bfsize = 1 << (r-k); for(i = 0; i < bfsize / 2; i++) { p = j * bfsize; X2[i + p] = X1[i + p] + X1[i + p + bfsize / 2]; X2[i + p + bfsize / 2] = X1[i + p] - X1[i + p + bfsize / 2]; } } // 互換X1和X2 X = X1; X1 = X2; X2 = X; } // 調(diào)整系數(shù) for(j = 0; j < count; j++) { p = 0; for(i = 0; i < r; i++) { if (j & (1<<i)) { p += 1 << (r-i-1); } } F[j] = X1[p] / count; } // 釋放內(nèi)存 delete X1; delete X2;}/************************************************************************* * * 函數(shù)名稱: * IWALSH() * * 參數(shù): * double * F - 指向頻域值的指針 * double * f - 指向時(shí)域值的指針 * r -2的冪數(shù) * * 返回值: * 無。 * * 說明: * 該函數(shù)用來實(shí)現(xiàn)快速沃爾什-哈達(dá)瑪反變換。 * ************************************************************************/VOID WINAPI IWALSH(double *F, double *f, int r){ // 變換點(diǎn)數(shù) LONG count; // 循環(huán)變量 int i; // 計(jì)算變換點(diǎn)數(shù) count = 1 << r; // 調(diào)用快速沃爾什-哈達(dá)瑪變換進(jìn)行反變換 WALSH(F, f, r); // 調(diào)整系數(shù) for(i = 0; i < count; i++) { f[i] *= count; }}/************************************************************************* * * 函數(shù)名稱: * DIBWalsh() * * 參數(shù): * LPSTR lpDIBBits - 指向源DIB圖像指針 * LONG lWidth - 源圖像寬度(象素?cái)?shù)) * LONG lHeight - 源圖像高度(象素?cái)?shù)) * * 返回值: * BOOL - 成功返回TRUE,否則返回FALSE。 * * 說明: * 該函數(shù)用來對(duì)圖像進(jìn)行沃爾什-哈達(dá)瑪變換。函數(shù)首先對(duì)圖像每列進(jìn)行一維 * 沃爾什-哈達(dá)瑪變換,然后對(duì)變換結(jié)果的每行進(jìn)行一維沃爾什-哈達(dá)瑪變換。 * ************************************************************************/BOOL WINAPI DIBWalsh(LPSTR lpDIBBits, LONG lWidth, LONG lHeight){ // 指向源圖像的指針 unsigned char* lpSrc; // 循環(huán)變量 LONG i; LONG j; // 進(jìn)行付立葉變換的寬度和高度(2的整數(shù)次方) LONG w; LONG h; // 中間變量 double dTemp; int wp; int hp; // 圖像每行的字節(jié)數(shù) LONG lLineBytes; // 計(jì)算圖像每行的字節(jié)數(shù) lLineBytes = WIDTHBYTES(lWidth * 8); // 賦初值 w = 1; h = 1; wp = 0; hp = 0; // 計(jì)算進(jìn)行離散余弦變換的寬度和高度(2的整數(shù)次方) while(w * 2 <= lWidth) { w *= 2; wp++; } while(h * 2 <= lHeight) { h *= 2; hp++; } // 分配內(nèi)存 double *f = new double[w * h]; double *F = new double[w * h]; // 行 for(i = 0; i < h; i++) { // 列 for(j = 0; j < w; j++) { // 指向DIB第i行,第j個(gè)象素的指針 lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j; // 給時(shí)域賦值 f[j + i * w] = *(lpSrc); } } for(i = 0; i < h; i++) { // 對(duì)y方向進(jìn)行沃爾什-哈達(dá)瑪變換 WALSH(f + w * i, F + w * i, wp); } // 保存計(jì)算結(jié)果 for(i = 0; i < h; i++) { for(j = 0; j < w; j++) { f[j * h + i] = F[j + w * i]; } } for(j = 0; j < w; j++) { // 對(duì)x方向進(jìn)行沃爾什-哈達(dá)瑪變換 WALSH(f + j * h, F + j * h, hp); } // 行 for(i = 0; i < h; i++) { // 列 for(j = 0; j < w; j++) { // 計(jì)算頻譜 dTemp = fabs(F[j * h + i] * 1000); // 判斷是否超過255 if (dTemp > 255) { // 對(duì)于超過的,直接設(shè)置為255 dTemp = 255; } // 指向DIB第i行,第j個(gè)象素的指針 lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j; // 更新源圖像 * (lpSrc) = (BYTE)(dTemp); } } //釋放內(nèi)存 delete f; delete F; // 返回 return TRUE;}/************************************************************************* * * 函數(shù)名稱: * DIBWalsh1() * * 參數(shù): * LPSTR lpDIBBits - 指向源DIB圖像指針 * LONG lWidth - 源圖像寬度(象素?cái)?shù)) * LONG lHeight - 源圖像高度(象素?cái)?shù)) * * 返回值: * BOOL - 成功返回TRUE,否則返回FALSE。 * * 說明: * 該函數(shù)用來對(duì)圖像進(jìn)行沃爾什-哈達(dá)瑪變換。于上面不同的是,此處是將二維 * 矩陣轉(zhuǎn)換成一個(gè)列向量,然后對(duì)該列向量進(jìn)行一次一維沃爾什-哈達(dá)瑪變換。 * ************************************************************************/BOOL WINAPI DIBWalsh1(LPSTR lpDIBBits, LONG lWidth, LONG lHeight){ // 指向源圖像的指針 unsigned char* lpSrc; // 循環(huán)變量 LONG i; LONG j; // 進(jìn)行付立葉變換的寬度和高度(2的整數(shù)次方) LONG w; LONG h; // 中間變量 double dTemp; int wp; int hp; // 圖像每行的字節(jié)數(shù) LONG lLineBytes; // 計(jì)算圖像每行的字節(jié)數(shù) lLineBytes = WIDTHBYTES(lWidth * 8); // 賦初值 w = 1; h = 1; wp = 0; hp = 0; // 計(jì)算進(jìn)行離散余弦變換的寬度和高度(2的整數(shù)次方) while(w * 2 <= lWidth) { w *= 2; wp++; } while(h * 2 <= lHeight) { h *= 2; hp++; } // 分配內(nèi)存 double *f = new double[w * h]; double *F = new double[w * h]; // 列 for(i = 0; i < w; i++) { // 行 for(j = 0; j < h; j++) { // 指向DIB第j行,第i個(gè)象素的指針 lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - j) + i; // 給時(shí)域賦值 f[j + i * w] = *(lpSrc); } } // 調(diào)用快速沃爾什-哈達(dá)瑪變換 WALSH(f, F, wp + hp); // 列 for(i = 0; i < w; i++) { // 行 for(j = 0; j < h; j++) { // 計(jì)算頻譜 dTemp = fabs(F[i * w + j] * 1000); // 判斷是否超過255 if (dTemp > 255) { // 對(duì)于超過的,直接設(shè)置為255 dTemp = 255; } // 指向DIB第j行,第i個(gè)象素的指針 lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - j) + i; // 更新源圖像 * (lpSrc) = (BYTE)(dTemp); } } //釋放內(nèi)存 delete f; delete F; // 返回 return TRUE;}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -