📄 liftingschemeview.cpp
字号:
for(i = 0; i < h; i++)
{
// 对y方向进行快速付立叶反变换
IFFT(&FD[w * i], &TD[w * i], wp);
}
// 行
for(i = 0; i < h; i++)
{ // 列
for(j = 0; j < w; j++)
{
// 计算频谱
dTemp = TD[j * h + i].real();
dTemp=(dTemp > 255)?255:dTemp;
finalImage[ i+ j*hh]=dTemp;
}
}
// 显示
DisplayImage(ww,hh,512,TRUE,ImageToRe);
if(reconstruct)
DisplayImage(ww,hh,512,TRUE,finalImage);
delete TD;
delete FD;
delete finalImage;
delete ImageToRe;
}
void CLiftingschemeView::DCTtransform(BYTE *Image, long ww, long hh, BOOL reconstruct,int n)
{
finalImage=new double[ww*hh];
ImageToRe=new double[ww*hh];
memset(finalImage, 0, sizeof(double) * ww* hh);
memset(ImageToRe, 0, sizeof(double) * ww* hh);
int GOB_num;
int MB_num;
int Block_num;
for(GOB_num=0;GOB_num<hh/16;GOB_num++)
{ for(MB_num=0;MB_num<ww/16;MB_num++)
{ for(Block_num=1;Block_num<=4;Block_num++)
{
unsigned char* lpSrc;//指向原图像指针
LONG i,j;
// int dTemp;//中间变量
//图像每行的字节数
LONG lLineBytes;
lLineBytes=WIDTHBYTES(ww*8);
double *f=new double[8*8];//分配内存f时域F频域
double *F=new double[8*8];
memset(F, 0, sizeof(double) * 8 * 8);//F赋初值
int x_Block,y_Block;
switch(Block_num)
{
case 1:x_Block=0;y_Block=0;break;
case 2:x_Block=0;y_Block=8;break;
case 3:x_Block=8;y_Block=0;break;
case 4:x_Block=8;y_Block=8;break;
}
//i,x_Block指行;j,y_Block指列
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
lpSrc=(unsigned char*)Image+lLineBytes*(hh-1-i-x_Block-GOB_num*16)+j+MB_num*16+y_Block;
f[j+i*8]=*(lpSrc);
}
}
// 正变换
if(n==0)
DCT(f,F,3);
else if(n==1)
FDT(f,F);
F[0]/=8;
for(i=1;i<64;i++)
{
F[i]/=8; //F[i]/=quant[GOB_num*22*4+MB_num*4+Block_num];
if(F[i]>127){F[i]=127;}
else if(F[i]<-127){F[i]=-127;}
}
for(i=0;i<8;i++)
for(j=0;j<8;j++)
ImageToRe[(i+x_Block+GOB_num*16)*lLineBytes+j+MB_num*16+y_Block]=F[j+i*8];
// 反变换
int tempp;
for(i=0;i<64;i++)
{tempp=(int)F[i];
f[i]=(double)tempp;}
{ f[0]*=8;
for(i=1;i<64;i++) //f[i]*=quant[GOB_num*22*4+MB_num*4+Block_num];
f[i]*=8;
if(n==0)
IDCT(f,F,3);
else if(n==1)
IFDT(f,F);
}
for(i=0;i<8;i++)
for(j=0;j<8;j++)
finalImage[(i+x_Block+GOB_num*16)*lLineBytes+j+MB_num*16+y_Block]=F[j+i*8];
delete f;
delete F;
}}}
// 显示
DisplayImage(ww,hh,512,TRUE,ImageToRe);
Sleep(500);
if(reconstruct)
DisplayImage(ww,hh,512,TRUE,finalImage);
delete finalImage;
delete ImageToRe;
}
void CLiftingschemeView::DCT(double *f, double *F, int r)
{
// 离散余弦变换点数
int count;
count = 1<<r;
// 循环变量
int m,n,x;
// 中间变量
double *dTemp=new double[count*count];
double *coff=new double[count];
// 设定系数coff
coff[0]=1/sqrt(count);
for(m=1;m<count;m++)
{ coff[m]=sqrt(2)/sqrt(count);
}
//dTemp赋初值
memset(dTemp, 0, sizeof(double) * count * count);
memset(F, 0, sizeof(double) * count * count);
// 求F[m,n]
for(n=0; n< count; n++)
{
for(m=0; m< count; m++)
{
for(x=0; x< count; x++)
{
dTemp[m*count+n]+=f[x*count+n]*coff[m]*cos((2*x+1)*PI*m/(2*count));
}
}
}
for(m=0; m< count; m++)
{
for(n=0; n< count; n++)
{
for(x=0; x< count; x++)
{
F[m*count+n]+=dTemp[m*count+x]*coff[n]*cos((2*x+1)*PI*n/(2*count));
}
}
}
// 释放内存
delete dTemp;
delete coff;
}
void CLiftingschemeView::IDCT(double *F, double *f, int r)
{
// 离散余弦变换点数
int count;
count = 1<<r;
int m,y,x;
double *dTemp=new double[count*count];
double *coff=new double[count];
// 设定系数coff
coff[0]=1/sqrt(count);
for(m=1;m<count;m++)
{ coff[m]=sqrt(2)/sqrt(count);
}
//dTemp赋初值
memset(dTemp, 0, sizeof(double) * count * count);
memset(f, 0, sizeof(double) * count * count);
// 求F[m,n]
for(x=0; x< count; x++)
for(y=0; y< count; y++)
for(m=0; m< count; m++)
dTemp[x*count+y]+=F[x*count+m]*coff[m]*cos((2*y+1)*PI*m/(2*count));
for(y=0; y< count; y++)
for(x=0; x< count; x++)
for(m=0; m< count; m++)
f[x*count+y]+=dTemp[m*count+y]*coff[m]*cos((2*x+1)*PI*m/(2*count));
// 释放内存
delete dTemp;
delete coff;
}
void CLiftingschemeView::FDT(double *block, double *coeff)
{
int j1, i, j, k;
float b[8];
float b1[8];
float d[8][8];
float f0=(float).7071068;
float f1=(float).4903926;
float f2=(float).4619398;
float f3=(float).4157348;
float f4=(float).3535534;
float f5=(float).2777851;
float f6=(float).1913417;
float f7=(float).0975452;
for (i = 0, k = 0; i < 8; i++, k += 8) {
for (j = 0; j < 8; j++) {
b[j] = (float)block[k+j];
}
/* Horizontal transform */
for (j = 0; j < 4; j++) {
j1 = 7 - j;
b1[j] = b[j] + b[j1];
b1[j1] = b[j] - b[j1];
}
b[0] = b1[0] + b1[3];
b[1] = b1[1] + b1[2];
b[2] = b1[1] - b1[2];
b[3] = b1[0] - b1[3];
b[4] = b1[4];
b[5] = (b1[6] - b1[5]) * f0;
b[6] = (b1[6] + b1[5]) * f0;
b[7] = b1[7];
d[i][0] = (b[0] + b[1]) * f4;
d[i][4] = (b[0] - b[1]) * f4;
d[i][2] = b[2] * f6 + b[3] * f2;
d[i][6] = b[3] * f6 - b[2] * f2;
b1[4] = b[4] + b[5];
b1[7] = b[7] + b[6];
b1[5] = b[4] - b[5];
b1[6] = b[7] - b[6];
d[i][1] = b1[4] * f7 + b1[7] * f1;
d[i][5] = b1[5] * f3 + b1[6] * f5;
d[i][7] = b1[7] * f7 - b1[4] * f1;
d[i][3] = b1[6] * f3 - b1[5] * f5;
}
/* Vertical transform */
for (i = 0; i < 8; i++) {
for (j = 0; j < 4; j++) {
j1 = 7 - j;
b1[j] = d[j][i] + d[j1][i];
b1[j1] = d[j][i] - d[j1][i];
}
b[0] = b1[0] + b1[3];
b[1] = b1[1] + b1[2];
b[2] = b1[1] - b1[2];
b[3] = b1[0] - b1[3];
b[4] = b1[4];
b[5] = (b1[6] - b1[5]) * f0;
b[6] = (b1[6] + b1[5]) * f0;
b[7] = b1[7];
d[0][i] = (b[0] + b[1]) * f4;
d[4][i] = (b[0] - b[1]) * f4;
d[2][i] = b[2] * f6 + b[3] * f2;
d[6][i] = b[3] * f6 - b[2] * f2;
b1[4] = b[4] + b[5];
b1[7] = b[7] + b[6];
b1[5] = b[4] - b[5];
b1[6] = b[7] - b[6];
d[1][i] = b1[4] * f7 + b1[7] * f1;
d[5][i] = b1[5] * f3 + b1[6] * f5;
d[7][i] = b1[7] * f7 - b1[4] * f1;
d[3][i] = b1[6] * f3 - b1[5] * f5;
}
for (i = 0; i < 8; i++) {
for (j = 0; j < 8; j++) {
*(coeff+i*8+j) = (int)(d[i][j]);
}
}
}
void CLiftingschemeView::IFDT(double *coeff, double *block)
{
int j1, i, j;
double b[8], b1[8], d[8][8];
double f0=.7071068;
double f1=.4903926;
double f2=.4619398;
double f3=.4157348;
double f4=.3535534;
double f5=.2777851;
double f6=.1913417;
double f7=.0975452;
double e, f, g, h;
/* Horizontal */
/* Descan coefficients first */
for (i = 0; i < 8; i++) {
for (j = 0; j < 8; j++) {
b[j] = *( coeff+i*8+j);
}
e = b[1] * f7 - b[7] * f1;
h = b[7] * f7 + b[1] * f1;
f = b[5] * f3 - b[3] * f5;
g = b[3] * f3 + b[5] * f5;
b1[0] = (b[0] + b[4]) * f4;
b1[1] = (b[0] - b[4]) * f4;
b1[2] = b[2] * f6 - b[6] * f2;
b1[3] = b[6] * f6 + b[2] * f2;
b[4] = e + f;
b1[5] = e - f;
b1[6] = h - g;
b[7] = h + g;
b[5] = (b1[6] - b1[5]) * f0;
b[6] = (b1[6] + b1[5]) * f0;
b[0] = b1[0] + b1[3];
b[1] = b1[1] + b1[2];
b[2] = b1[1] - b1[2];
b[3] = b1[0] - b1[3];
for (j = 0; j < 4; j++) {
j1 = 7 - j;
d[i][j] = b[j] + b[j1];
d[i][j1] = b[j] - b[j1];
}
}
/* Vertical */
for (i = 0; i < 8; i++) {
for (j = 0; j < 8; j++) {
b[j] = d[j][i];
}
e = b[1] * f7 - b[7] * f1;
h = b[7] * f7 + b[1] * f1;
f = b[5] * f3 - b[3] * f5;
g = b[3] * f3 + b[5] * f5;
b1[0] = (b[0] + b[4]) * f4;
b1[1] = (b[0] - b[4]) * f4;
b1[2] = b[2] * f6 - b[6] * f2;
b1[3] = b[6] * f6 + b[2] * f2;
b[4] = e + f;
b1[5] = e - f;
b1[6] = h - g;
b[7] = h + g;
b[5] = (b1[6] - b1[5]) * f0;
b[6] = (b1[6] + b1[5]) * f0;
b[0] = b1[0] + b1[3];
b[1] = b1[1] + b1[2];
b[2] = b1[1] - b1[2];
b[3] = b1[0] - b1[3];
for (j = 0; j < 4; j++) {
j1 = 7 - j;
d[j][i] = b[j] + b[j1];
d[j1][i] = b[j] - b[j1];
}
}
for (i = 0; i < 8; i++) {
for (j = 0; j < 8; j++) {
*(block + i * 8 + j) = mnint(d[i][j]);
}
}
}
void CLiftingschemeView::OnTransDCT2()
{
CChoose dlg;
BOOL reconstruct;
if(dlg.DoModal()==IDOK)
reconstruct=TRUE;
else
reconstruct=FALSE;
DCTtransform(m_pImageData,m_orgWidth,m_orgHeight,reconstruct,1);
}
void CLiftingschemeView::FFT(complex<double> * TD, complex<double> * FD, int r)
{
// 付立叶变换点数
LONG count;
// 循环变量
int i,j,k;
// 中间变量
int bfsize,p;
// 角度
double angle;
complex<double> *W,*X1,*X2,*X;
// 计算付立叶变换点数
count = 1 << r;
// 分配运算所需存储器
W = new complex<double>[count / 2];
X1 = new complex<double>[count];
X2 = new complex<double>[count];
// 计算加权系数
for(i = 0; i < count / 2; i++)
{
angle = -i * PI * 2 / count;
W[i] = complex<double> (cos(angle), sin(angle));
}
// 将时域点写入X1
memcpy(X1, TD, sizeof(complex<double>) * count);
// 采用蝶形算法进行快速付立叶变换
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]) * W[i * (1<<k)];
}
}
X = X1;
X1 = X2;
X2 = X;
}
// 重新排序
for(j = 0; j < count; j++)
{
p = 0;
for(i = 0; i < r; i++)
{
if (j&(1<<i))
{
p+=1<<(r-i-1);
}
}
FD[j]=X1[p];
}
// 释放内存
delete W;
delete X1;
delete X2;
}
void CLiftingschemeView::IFFT(complex<double> * FD, complex<double> * TD, int r)
{
// 付立叶变换点数
LONG count;
// 循环变量
int i;
complex<double> *X;
// 计算付立叶变换点数
count = 1 << r;
// 分配运算所需存储器
X = new complex<double>[count];
// 将频域点写入X
memcpy(X, FD, sizeof(complex<double>) * count);
// 求共轭
for(i = 0; i < count; i++)
{
X[i] = complex<double> (X[i].real(), -X[i].imag());
}
// 调用快速付立叶变换
FFT(X, TD, r);
// 求时域点的共轭
for(i = 0; i < count; i++)
{
TD[i] = complex<double> (TD[i].real() / count, -TD[i].imag() / count);
}
// 释放内存
delete X;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -