?? intlbt.cpp
字號:
// IntLBT.cpp: implementation of the CIntLBT class.
// 作者:張增輝 國防科技大學理學院數(shù)學系 2001.11
// QQ:15105473 email: zenghui1980@163.com
//
// 此為整數(shù)疊式變換的程序,算法流程圖有成老師文章給出。
// IntLBT 沒有經過邊界的延拓,可以做到完全無損的變換。 但是變換后的數(shù)據(jù)
// 存在邊界存在4個數(shù)據(jù)的邊。 因此在編碼時候需要特殊的處理。
//
// 程序包括以下部分: IntDCT and I_IntDCT
// DCT_Butterfly and I_DCT_Butterfly .... the butterfly after IntDCT
// IntLBT and I_IntLBT after DCT_Butterfly
// IntLBT2D and I_IntLBT2D
////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ImgPro_IntLBT.h"
#include "IntLBT.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CIntLBT::CIntLBT()
{
}
CIntLBT::~CIntLBT()
{
}
void CIntLBT::IntLBT2D(int **data, int height, int width)
{
int i,j,k;
int nheight, nwidth;
nheight = (height >>3); // 列分塊的數(shù)目
nwidth = (width >>3); // 行分塊的數(shù)目
int n_write_data, *data_lap1, *data_lap2; // n_write_data 為寫數(shù)據(jù)位置
data_lap1 = new int [8];
data_lap2 = new int [8];
/// 先對行進行IntLBT 變換
for (i=0; i<height; i++)
{
for (k=0; k<8; k++) *(data_lap1+k) = *(*(data+i) + k); //讀取開始的8個點
DCT_Butterfly1D(data_lap1); //
for (k=0; k<4; k++) *(*(data+i) +k) = *(data_lap1+k); // 邊界處理, 不做蝶式變換
n_write_data = 4;
for (j=1; j<nwidth-1; j++)
{
for (k=0; k<8; k++) *(data_lap2+k) = *(*(data + i) + n_write_data+k+4); //讀取下8個點
DCT_Butterfly1D(data_lap2); //
IntLBT1D(data_lap1, data_lap2); // 蝶式變換 ,8+8 -----> 8
for (k=0; k<8; k++) *(*(data+i)+n_write_data+k) = *(data_lap1 + k); //變換后數(shù)據(jù)寫入
for (k=0; k<8; k++) *(data_lap1 + k) = *(data_lap2 + k); //交換數(shù)據(jù) 供下一次變換使用
n_write_data += 8; // 移動寫入標志
}
for (k=0; k<8; k++) *(data_lap2+k) = *(*(data + i) + n_write_data+k+4); //
DCT_Butterfly1D(data_lap2); //
IntLBT1D(data_lap1, data_lap2); //
for (k=0; k<8; k++) *(data_lap2+k) = *(*(data + i) + n_write_data+k+4); //
for (k=0; k<8; k++) *(*(data+i)+n_write_data+k) = *(data_lap1 + k); //
n_write_data += 8; // 計算到數(shù)第二塊數(shù)據(jù), 并保證最后8個數(shù)據(jù)不被破壞
DCT_Butterfly1D(data_lap2);
for (k=0; k<4; k++) *(*(data+i)+n_write_data+k) = *(data_lap2+k+4); // 邊界處理
}
//對每一行做 IntLBT 變換結束
//按列進行
for (i=0; i<width; i++)
{
for (k=0; k<8; k++) *(data_lap1+k) = *(*(data+k) + i);
DCT_Butterfly1D(data_lap1);
for (k=0; k<4; k++) *(*(data+k) +i) = *(data_lap1+k);
n_write_data = 4;
for (j=1; j<nheight-1; j++)
{
for (k=0; k<8; k++) *(data_lap2+k) = *(*(data+n_write_data+k+4) + i);
DCT_Butterfly1D(data_lap2);
IntLBT1D(data_lap1, data_lap2);
for (k=0; k<8; k++) *(*(data+n_write_data+k)+i) = *(data_lap1 + k);
for (k=0; k<8; k++) *(data_lap1 + k) = *(data_lap2 + k);
n_write_data += 8;
}
for (k=0; k<8; k++) *(data_lap2+k) = *(*(data+n_write_data+k+4) + i);
DCT_Butterfly1D(data_lap2);
IntLBT1D(data_lap1, data_lap2);
for (k=0; k<8; k++) *(data_lap2+k) = *(*(data+n_write_data+k+4) + i);
for (k=0; k<8; k++) *(*(data+n_write_data+k)+i) = *(data_lap1 + k);
n_write_data += 8;
DCT_Butterfly1D(data_lap2);
for (k=0; k<4; k++) *(*(data+n_write_data+k)+i) = *(data_lap2+k+4);
}
delete data_lap1;
delete data_lap2;
}
void CIntLBT::I_IntLBT2D(int **data, int height, int width)
{
int i, j, k;
int nheight, nwidth;
nheight = (height >>3);
nwidth = (width >>3);
int n_write_data, *data_lap1, *data_lap2, *data_tmp;;
data_lap1 = new int [8];
data_lap2 = new int [8];
data_tmp = new int [8];
////////////////// 先按列做逆變換
for (i=0; i<width; i++)
{
//處理最開始的8個數(shù)據(jù)
for (k=0; k<4; k++) *(data_lap1+k) = *(*(data+k)+i); //讀入前面4個數(shù)據(jù)
//處理下4個數(shù)據(jù)
for (k=0; k<8; k++) *(data_lap2+k) = *(*(data+k+4)+i); //讀入下8個數(shù)據(jù)
I_IntLBT_1to1(data_lap2);
for (k=0; k<4; k++) *(data_lap1+k+4) = *(data_lap2+k);
I_DCT_Butterfly(data_lap1); //反變換求出前8個數(shù)據(jù)
for (k=0; k<8; k++) *(data_lap2+k) = *(*(data+k+4)+i);
for (k=0; k<8; k++) *(*(data+k)+i) = *(data_lap1+k); //寫入數(shù)據(jù)
//處理中間的數(shù)據(jù)
for (k=0; k<8; k++) *(data_lap1+k) = *(data_lap2+k); //讀入第一塊
n_write_data = 8;
for (j=2; j<nheight; j++)
{
for (k=0; k<8; k++)
{
*(data_lap2+k) = *(*(data+4+n_write_data+k)+i); //讀入下一塊
*(data_tmp+k) = *(data_lap2+k); // 在反變換之前備份當前數(shù)據(jù)
}
I_IntLBT1D(data_lap1, data_lap2);
I_DCT_Butterfly(data_lap1);
for (k=0; k<8; k++) *(*(data+n_write_data+k)+i) = *(data_lap1+k); //寫入數(shù)據(jù)
for (k=0; k<8; k++) *(data_lap1+k) = *(data_tmp+k);
n_write_data += 8;
}
//處理最后的8個數(shù)據(jù)
I_IntLBT_1to1(data_lap1);
for (k=0; k<4; k++) *(data_lap1+k) = *(data_lap1+k+4);
for (k=0; k<4; k++) *(data_lap1+k+4) = *(*(data+n_write_data+k+4)+i);
I_DCT_Butterfly(data_lap1);
for (k=0; k<8; k++) *(*(data+n_write_data+k)+i) = *(data_lap1+k);
}
////////////////// 按行做逆變換
for (i=0; i<height; i++)
{
//處理最開始的8個數(shù)據(jù)
for (k=0; k<4; k++) *(data_lap1+k) = *(*(data+i)+k); //讀入前面4個數(shù)據(jù)
//處理下4個數(shù)據(jù)
for (k=0; k<8; k++) *(data_lap2+k) = *(*(data+i)+k+4); //讀入下8個數(shù)據(jù)
I_IntLBT_1to1(data_lap2);
for (k=0; k<4; k++) *(data_lap1+k+4) = *(data_lap2+k);
I_DCT_Butterfly(data_lap1); //反變換求出前8個數(shù)據(jù)
for (k=0; k<8; k++) *(data_lap2+k) = *(*(data+i)+k+4);
for (k=0; k<8; k++) *(*(data+i)+k) = *(data_lap1+k); //寫入數(shù)據(jù)
//處理中間的數(shù)據(jù)
for (k=0; k<8; k++) *(data_lap1+k) = *(data_lap2+k); //讀入第一塊
n_write_data = 8;
for (j=2; j<nwidth; j++)
{
for (k=0; k<8; k++)
{
*(data_lap2+k) = *(*(data+i)+4+n_write_data+k); //讀入下一塊
*(data_tmp+k) = *(data_lap2+k);
}
I_IntLBT1D(data_lap1, data_lap2);
I_DCT_Butterfly(data_lap1);
for (k=0; k<8; k++) *(*(data+i)+n_write_data+k) = *(data_lap1+k); //寫入數(shù)據(jù)
for (k=0; k<8; k++) *(data_lap1+k) = *(data_tmp+k);
n_write_data += 8;
}
//處理最后的8個數(shù)據(jù)
for (k=0; k<8; k++) *(data_lap2+k) = *(data_lap1+k); //讀入最后一個完整的變換后的塊
I_IntLBT_1to1(data_lap2);
for (k=0; k<4; k++) *(data_lap1+k) = *(data_lap2+k+4);
for (k=0; k<4; k++) *(data_lap1+k+4) = *(*(data+i)+n_write_data+k+4);
I_DCT_Butterfly(data_lap1);
for (k=0; k<8; k++) *(*(data+i)+n_write_data+k) = *(data_lap1+k);
}
delete data_lap1;
delete data_lap2;
delete data_tmp;
}
void CIntLBT::IntLBT1D(int *data1, int *data2)
{
/// input the two block ------> data1 data2
/// output the lapped data -----> data1
// DCT_Butterfly1D(data1);
// DCT_Butterfly1D(data2);
*data1 = *(data1+4) + *data2;
*(data1+1) = *(data1+5) + *(data2+1);
*(data1+2) = *(data1+6) + *(data2+2);
*(data1+3) = *(data1+7) + *(data2+3);
*(data1+4) = *(data1+4) - *data2;
*(data1+5) = *(data1+5) - *(data2+1);
*(data1+6) = *(data1+6) - *(data2+2);
*(data1+7) = *(data1+7) - *(data2+3);
//做一個 旋轉變換
*(data1+5) = *(data1+5) + (*(data1+4) >>2) - (*(data1+4) >>5);
*(data1+4) = *(data1+4) - (*(data1+5) >>2) - (*(data1+5) >>3) - (*(data1+5) >>5);
*(data1+5) = *(data1+5) + (*(data1+4) >>2) - (*(data1+4) >>5);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -