⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 16point_bindct.cpp

📁 对图像进行整数DCT变换
💻 CPP
字号:
#include "stdio.h"
#include "math.h"
#include "stdlib.h"

#define RESET 64
#define MAXVAL 65535
#define RANGE 65536 
#define qbpp 16
#define bpp 16
#define LIMIT 64
#define NEAR 0

unsigned long output;
static int cnt=0,code=0,pp=0;
int Ac,Count;
long int counter=0;
FILE *fp;
FILE *out;

int X=512,Y=512;
int Row=16,Col=16;
int array_a[512][512];
int array[16][16];
int array_r[16];
int array_c[16];

void DCT_1D_r(int x[16],int RowX);
void DCT_1D_c(int x[16],int ColY);
void DCT_2D();
int LG(int C,int A);
void GR(int x);

void DCT_1D_r(int x[16],int RowX)
{
	int X[16];
	int j;
	double p1=0.4375,p2=0.09375,p3=0.09375,p4=0.3125,p5=0.25,p6=0.4375,p7=0.4375,p8=0.90625,p9=0.90625,p10=0.15625,p11=0.15625,p12=0.59375,p13=0.59375,p14=0.34375,p15=0.34375;
	double u1=0.375,u2=0.1875,u3=0.5625,u4=0.375,u5=0.375,u6=1,u7=0.3125,u8=0.875,u9=0.625;

	x[15]=x[0]-x[15];
	x[0]=x[0]-floor(0.5*x[15]);
	x[14]=x[1]-x[14];
	x[1]=x[1]-floor(0.5*x[14]);
	x[13]=x[2]-x[13];
	x[2]=x[2]-floor(0.5*x[13]);
	x[12]=x[3]-x[12];
	x[3]=x[3]-floor(0.5*x[12]);
	x[11]=x[4]-x[11];
	x[4]=x[4]-floor(0.5*x[11]);
	x[10]=x[5]-x[10];
	x[5]=x[5]-floor(0.5*x[10]);
	x[9]=x[6]-x[9];
	x[6]=x[6]-floor(0.5*x[9]);
	x[8]=x[7]-x[8];
	x[7]=x[7]-floor(0.5*x[8]);
	x[7]=x[0]-x[7];
	x[0]=x[0]-floor(0.5*x[7]);
	x[6]=x[1]-x[6];
	x[1]=x[1]-floor(0.5*x[6]);
	x[5]=x[2]-x[5];
	x[2]=x[2]-floor(0.5*x[5]);
	x[4]=x[3]-x[4];
	x[3]=x[3]-floor(0.5*x[4]);
	x[3]=x[0]-x[3];
	x[0]=x[0]-floor(0.5*x[3]);
	x[2]=x[1]-x[2];
	x[1]=x[1]-floor(0.5*x[2]);
//	x[0]=x[1]+x[0];
//	x[1]=floor(0.5*x[0])-x[1];
	x[1]=x[0]-x[1];
	x[0]=x[0]-floor(0.5*x[1]);
	x[2]=floor(p1*x[3])-x[2];
	x[3]=x[3]-floor(u1*x[2]);
	x[7]=x[7]-floor(p4*x[4]);
	x[4]=x[4]+floor(u3*x[7]);
	x[7]=x[7]-floor(p5*x[4]);
	x[6]=x[6]-floor(p2*x[5]);
	x[5]=x[5]+floor(u2*x[6]);
	x[6]=x[6]-floor(p3*x[5]);
	x[6]=x[4]-x[6];
	x[4]=x[4]-floor(0.5*x[6]);
	x[5]=x[7]-x[5];
	x[7]=x[7]-floor(0.5*x[5]);
//	x[7]=x[4]+x[7];
//	x[4]=floor(0.5*x[7])-x[4];
	x[4]=x[7]-x[4];
	x[7]=x[7]-floor(0.5*x[4]);
	x[15]=x[15]-floor(p14*x[8]);
	x[8]=x[8]+floor(u9*x[15]);
	x[15]=x[15]-floor(p15*x[8]);
	x[9]=x[9]-floor(p12*x[14]);
	x[14]=x[14]+floor(u8*x[9]);
	x[9]=x[9]-floor(p13*x[14]);
	x[13]=x[13]-floor(p10*x[10]);
	x[10]=x[10]+floor(u7*x[13]);
	x[13]=x[13]-floor(p11*x[10]);
	x[11]=x[11]-floor(p8*x[12]);
	x[12]=x[12]+floor(u6*x[11]);
	x[11]=x[11]-floor(p9*x[12]);
	x[11]=x[8]-x[11];
	x[8]=x[8]-floor(0.5*x[11]);
	x[10]=x[9]-x[10];
	x[9]=x[9]-floor(0.5*x[10]);
	x[15]=x[12]-x[15];
	x[12]=x[12]-floor(0.5*x[15]);
	x[14]=x[13]-x[14];
	x[13]=x[13]-floor(0.5*x[14]);
	x[14]=x[8]-x[14];
	x[8]=x[8]-floor(0.5*x[14]);
	x[15]=x[9]-x[15];
	x[9]=x[9]-floor(0.5*x[15]);
	x[11]=x[10]-x[11];
	x[10]=x[10]-floor(0.5*x[11]);
	x[13]=x[12]-x[13];
	x[12]=x[12]-floor(0.5*x[13]);
	x[8]=x[8]+floor(p6*x[9]);
	x[9]=floor(u4*x[8])-x[9];
	x[11]=x[11]+x[12];
	x[12]=x[12]-floor(0.5*x[11]);
	x[14]=x[14]+floor(p7*x[15]);
	x[15]=x[15]-floor(u5*x[14]);
	X[0]=x[0];
	X[1]=x[12];
	X[2]=x[7];
	X[3]=x[9];
	X[4]=x[3];
	X[5]=x[14];
	X[6]=x[5];
	X[7]=x[13];
	X[8]=x[1];
	X[9]=x[10];
	X[10]=x[6];
	X[11]=x[15];
	X[12]=x[2];
	X[13]=x[8];
	X[14]=x[4];
	X[15]=x[11];

	for(j=0;j<Col;j++)
		array[RowX][j]=X[j];

}

void DCT_1D_c(int x[16],int ColY)
{
	int X[16];
	int i;
	double p1=0.4375,p2=0.09375,p3=0.09375,p4=0.3125,p5=0.25,p6=0.4375,p7=0.4375,p8=0.90625,p9=0.90625,p10=0.15625,p11=0.15625,p12=0.59375,p13=0.59375,p14=0.34375,p15=0.34375;
	double u1=0.375,u2=0.1875,u3=0.5625,u4=0.375,u5=0.375,u6=1,u7=0.3125,u8=0.875,u9=0.625;

	x[15]=x[0]-x[15];
	x[0]=x[0]-floor(0.5*x[15]);
	x[14]=x[1]-x[14];
	x[1]=x[1]-floor(0.5*x[14]);
	x[13]=x[2]-x[13];
	x[2]=x[2]-floor(0.5*x[13]);
	x[12]=x[3]-x[12];
	x[3]=x[3]-floor(0.5*x[12]);
	x[11]=x[4]-x[11];
	x[4]=x[4]-floor(0.5*x[11]);
	x[10]=x[5]-x[10];
	x[5]=x[5]-floor(0.5*x[10]);
	x[9]=x[6]-x[9];
	x[6]=x[6]-floor(0.5*x[9]);
	x[8]=x[7]-x[8];
	x[7]=x[7]-floor(0.5*x[8]);
	x[7]=x[0]-x[7];
	x[0]=x[0]-floor(0.5*x[7]);
	x[6]=x[1]-x[6];
	x[1]=x[1]-floor(0.5*x[6]);
	x[5]=x[2]-x[5];
	x[2]=x[2]-floor(0.5*x[5]);
	x[4]=x[3]-x[4];
	x[3]=x[3]-floor(0.5*x[4]);
	x[3]=x[0]-x[3];
	x[0]=x[0]-floor(0.5*x[3]);
	x[2]=x[1]-x[2];
	x[1]=x[1]-floor(0.5*x[2]);
//	x[0]=x[1]+x[0];
//	x[1]=floor(0.5*x[0])-x[1];
	x[1]=x[0]-x[1];
	x[0]=x[0]-floor(0.5*x[1]);
	x[2]=floor(p1*x[3])-x[2];
	x[3]=x[3]-floor(u1*x[2]);
	x[7]=x[7]-floor(p4*x[4]);
	x[4]=x[4]+floor(u3*x[7]);
	x[7]=x[7]-floor(p5*x[4]);
	x[6]=x[6]-floor(p2*x[5]);
	x[5]=x[5]+floor(u2*x[6]);
	x[6]=x[6]-floor(p3*x[5]);
	x[6]=x[4]-x[6];
	x[4]=x[4]-floor(0.5*x[6]);
	x[5]=x[7]-x[5];
	x[7]=x[7]-floor(0.5*x[5]);
//	x[7]=x[4]+x[7];
//	x[4]=floor(0.5*x[7])-x[4];
	x[4]=x[7]-x[4];
	x[7]=x[7]-floor(0.5*x[4]);
	x[15]=x[15]-floor(p14*x[8]);
	x[8]=x[8]+floor(u9*x[15]);
	x[15]=x[15]-floor(p15*x[8]);
	x[9]=x[9]-floor(p12*x[14]);
	x[14]=x[14]+floor(u8*x[9]);
	x[9]=x[9]-floor(p13*x[14]);
	x[13]=x[13]-floor(p10*x[10]);
	x[10]=x[10]+floor(u7*x[13]);
	x[13]=x[13]-floor(p11*x[10]);
	x[11]=x[11]-floor(p8*x[12]);
	x[12]=x[12]+floor(u6*x[11]);
	x[11]=x[11]-floor(p9*x[12]);
	x[11]=x[8]-x[11];
	x[8]=x[8]-floor(0.5*x[11]);
	x[10]=x[9]-x[10];
	x[9]=x[9]-floor(0.5*x[10]);
	x[15]=x[12]-x[15];
	x[12]=x[12]-floor(0.5*x[15]);
	x[14]=x[13]-x[14];
	x[13]=x[13]-floor(0.5*x[14]);
	x[14]=x[8]-x[14];
	x[8]=x[8]-floor(0.5*x[14]);
	x[15]=x[9]-x[15];
	x[9]=x[9]-floor(0.5*x[15]);
	x[11]=x[10]-x[11];
	x[10]=x[10]-floor(0.5*x[11]);
	x[13]=x[12]-x[13];
	x[12]=x[12]-floor(0.5*x[13]);
	x[8]=x[8]+floor(p6*x[9]);
	x[9]=floor(u4*x[8])-x[9];
	x[11]=x[11]+x[12];
	x[12]=x[12]-floor(0.5*x[11]);
	x[14]=x[14]+floor(p7*x[15]);
	x[15]=x[15]-floor(u5*x[14]);
	X[0]=x[0];
	X[1]=x[12];
	X[2]=x[7];
	X[3]=x[9];
	X[4]=x[3];
	X[5]=x[14];
	X[6]=x[5];
	X[7]=x[13];
	X[8]=x[1];
	X[9]=x[10];
	X[10]=x[6];
	X[11]=x[15];
	X[12]=x[2];
	X[13]=x[8];
	X[14]=x[4];
	X[15]=x[11];

	for(i=0;i<Row;i++)
		array[i][ColY]=X[i];

}

void DCT_2D()
{
	int i,j;

	for(i=0;i<Row;i++)
	{
		for(j=0;j<Col;j++)
			array_r[j]=array[i][j];
		DCT_1D_r(array_r,i);
	}

/*	for(i=0;i<Row;i++)
	{
		for(j=0;j<Col;j++)
			printf("%d ",array[i][j]);
		printf("\n");
	}*/

	for(j=0;j<Col;j++)
	{
		for(i=0;i<Row;i++)
			array_c[i]=array[i][j];
		DCT_1D_c(array_c,j);
	}
}

int LG(int C,int A)
{
	int i;
	for(i=0;(C<<i)<A;i++);
	     return(i);
}

void writecode(int *cnt,int *pp,unsigned long *output,int *code)
{
	  unsigned long c;
	  if((*cnt)<8)
		  *code=(*code<<(*cnt-*pp))+(*output);/*以1byte为单位处理。把之前的码流向前推当前码流的长度,加入当前输出的码流*/
	  else{
		  while(*cnt>=8)
		  {
				if(*cnt>32)/*以4byte为存储器最大值*/
					{
					*code=(*code<<(8-*pp));
					fwrite(code,1,1,fp);/*把code指向的1×1个字节输出到fp所指的文件中*/
					counter++;
					*code=0;
					*cnt=*cnt-8;
					
					} 
				else        
					{
					*code=(*code<<(8-*pp))+(255&(*output>>(*cnt-8)));
					fwrite(code,1,1,fp);
					counter++;
					*code=0;
					*cnt=*cnt-8;
					}
			}
            c=~(~0<<*cnt);
			*code=c&(*output);
		}
}

void GR(int Errval)
{
	int MErrval;
	unsigned b,c;
	int i,j,k;
	unsigned interim;
	output=0;


			k=LG(Count,Ac);

			if((NEAR==0)&&(k==0))
			{
				if(Errval>=0)
					MErrval=2*Errval+1;
				else
					MErrval=-2*(Errval+1);
			}
			else
			{
				if(Errval>=0)
					MErrval=2*Errval;
				else
					MErrval=-2*Errval-1;
			}
			interim=MErrval;
			interim=interim>>k;/*除最低k位以外的高位*/
			if(interim<((unsigned)(LIMIT-qbpp-1)))
			{
				c=~(~0<<k);
				b=c&MErrval;/*截取MErrval的最低k位*/
				output=(output<<(interim+1))+1;/*左移interim+1得到interim+1个零,加一后即interim个零接一个1*/
				output=output<<k;
				output=output+b;
				pp=cnt;
				cnt=cnt+interim+1+k; 		
				writecode(&cnt,&pp,&output,&code);
			
			}
			else
			{
				unsigned b,c;
				output=(output<<(LIMIT-qbpp))+1;/*当前码流为:LIMIT-qbpp-1个零,一个1*/
				output=output<<qbpp;/*后接qbpp位的数字*/
				c=~(~0<<qbpp);
				b=c&(MErrval-1);/*取MErrval-1的后qbpp位*/
				output=output+b;
				pp=cnt;
				cnt=cnt+LIMIT; 		
				writecode(&cnt,&pp,&output,&code);
			}

			Ac=Ac+abs(Errval);
			if(Count==RESET)
			{
				Ac=Ac>>1;
				Count=Count>>1;
			}
			Count=Count+1;

}

void main()
{
	int i,j;
	int k,t;
	int m,n;
	int temp=0;
	int min=255,max=0;	
	int a=0,b=0;
	int c=0,d=0;
	
	fp=fopen("e:\\felicia\\RADAR.raw","rb");

	for(m=0;m<X;m++)
	{
		for(n=0;n<Y;n++)
		{
			fread(&array_a[m][n],1,1,fp);
		}
	}

	fclose(fp);

	fp=fopen("e:\\felicia\\RADAR_cofficient.RAW","wb");

	for(m=0;m<X;m++)
	{
		for(n=0;n<Y;n++)
		{
			fprintf(fp,"%4d",array_a[m][n]);
			if(((n+1)%16)==0&&n!=511)
				fprintf(fp,"\t");
		}
		fprintf(fp,"\n");
		if(((m+1)%16)==0&&m!=511)
			fprintf(fp,"\n");
		
	}

	fclose(fp);

	fp=fopen("e:\\felicia\\16point_binDCT_RADAR_reduce_zscan.raw","wb");
	out=fopen("e:\\felicia\\16point_binDCT_RADAR_reduce.raw","wb");

	Ac=__max(2,(RANGE+(1<<5))/(1<<6));
	Count=1;

	for(m=0;m<X;m+=16)
	{
		for(n=0;n<Y;n+=16)
		{
			for(i=0;i<Row;i++)
			{
				for(j=0;j<Col;j++)
					array[i][j]=array_a[m+i][n+j];
			}

			DCT_2D();
			array[0][0]=array[0][0]-temp;

/*			for(i=0;i<Row;i++)
				for(j=0;j<Col;j++)
				{
					GR(array[i][j]);
				}
*/
			for(k=0;k<31;k++)
				if(k<16)
				{
					if(k%2==0)
						for(j=0;j<=k;j++)
						{
							GR(array[k-j][j]);
//							printf("%d ",array[k-j][j]);
						}
					else
						for(i=0;i<=k;i++)
						{
							GR(array[i][k-i]);
//							printf("%d ",array[i][k-i]);
						}
				}
				else
				{
					if(k%2==0)
						for(i=15,t=i;i>=k-t;i--)
						{
							GR(array[i][k-i]);
//							printf("%d ",array[i][k-i]);
						}
					else
						for(j=15,t=j;j>=k-t;j--)
						{
							GR(array[k-j][j]);
//							printf("%d ",array[k-j][j]);
						}
				}
			for(i=0;i<Row;i++)
				for(j=0;j<Col;j++)
				{
					fprintf(out,"%d ",array[i][j]);
					if(array[i][j]<=min)
					{
						min=array[i][j];
						a=m+i;
						b=n+j;
					}
					if(array[i][j]>=max)
					{
						max=array[i][j];
						c=m+i;
						d=n+j;
					}
				}
			
		temp=temp+array[0][0];	
		}
	}	

	if(cnt>0)
		code=code<<(8-cnt);
	fwrite(&code,1,1,fp);

	fclose(fp);
	printf("max=%d,row=%d,col=%d\nmin=%d,row=%d,col=%d\n",max,a,b,min,c,d);
	printf("end");
	
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -