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

📄 main.c.bak

📁 这是我刚刚完成的关于JPEG2000的C语言实现的部分程序。小波变换是采用97变换
💻 BAK
📖 第 1 页 / 共 2 页
字号:
		}		
	}
	for(i = 0;i<LENGTH/(1<<(level+1));i++)//行128 0--64
	{	
		for(j = 0;j<WIDTH/(1<<(level+1));j++)//列512  00--256
		{
			buffer[i+4][j+4] = interleave[i+4][j+4];     //偶数行偶数列	
		}		
	}
#ifdef debug
printf("\nthe interleave number is:");
		for(i = 0;i<LENGTH;i++)
			for(j = 0;j<WIDTH;j++)
			{
				if(!j%8) printf("\n");
				printf("%3d ",(int)(interleave[i+4][j+4]+0.5));
			}
//		for(i = 0;i<LENGTH;i++)
//			for(j = 0;j<WIDTH;j++)
//			{
//				fwrite(&buffer[i][j], 1,1,out);
//			}
//		fclose(out);
#endif

}
//#ifdef fdwt
//		for(i = 0;i<LENGTH;i++)
//			for(j = 0;j<WIDTH;j++)
//			{
//		//		fwrite(&interleave[i+4][j+4], 4,1,inter);
//				fprintf(inter,"%x",&interleave[i+4][j+4]);
//			}
//	
//#endif
/*****************************************************************************
以下是量化部分。暂时量化步长取1。
******************************************************************************/


/*****************************************************************************
以上完成量化部分。以下部分是对EBCOT的编码。三个通道。四种编码形式
功能描述:编码过程中,每个系数总处于三种状态之一:无效态,有效态,上下文有效态
******************************************************************************/

for(m =0;m<((image_size)/(block_size))/2;m++)
	for(n = 0;n<((image_size)/(block_size)/2);n++)
	{
		for(i=0;i<BLOCKLENGTH;i++)
			for(j=0;j<BLOCKWIDTH;j++)
			{
				block_bufferin[i][j] = floor(interleave[i+4+m*BLOCKLENGTH][j+4+n*BLOCKWIDTH]+0.5);
			}





	}
//
/******************************************************************************
以上完成EBCOT的编码,输出送入MQ算术编码器中
******************************************************************************/


/******************************************************************************
以下是逆变换
******************************************************************************/
#ifdef debuglietransform
level--;	
for(;level>-1;level--)
{
	for(i = 0;i<(LENGTH>>(level+1));i++)//行128 0--64
	{	
		for(j = 0;j<(WIDTH>>(level+1));j++)//列512  00--256
		{
			bufferout[i+4][j+4] = floor(buffer[i+4][j+4]+0.5);
			bufferout[i+(LENGTH>>(level+1))+4][j+4] = floor(interleave[i+(LENGTH>>(level+1))+4][j+4]+0.5);     //
			bufferout[i+4][j+(WIDTH>>(level+1))+4] = floor(interleave[i+4][j+(WIDTH>>(level+1))+4]+0.5);     //
			bufferout[i+(LENGTH>>(level+1))+4][j+(WIDTH>>(level+1))+4] =
				floor(interleave[i+(LENGTH>>(level+1))+4][j+(WIDTH>>(level+1))+4]+0.5);     //
		}		
	}
/*****************************************************************************
反解交织			 buffer[i+4][j+4] =	LL   //偶数行偶数列
					 buffer[i+5][j+5] = HL   //奇数行偶数列
					 buffer[i+4][j+5] = LH   //偶数行奇数列
					 buffer[i+5][j+5] = HH   //奇数行奇数列
*****************************************************************************/
	for(i = 0;i<LENGTH/(1<<(level+1));i++)//行128 0--64
	{
		
		for(j = 0;j<WIDTH/(1<<(level+1));j++)//列512  00--256
		{
			buffer[i*2+5][j*2+5]	= bufferout[i+4][j+4];    //偶数行偶数列
			buffer[i*2+4][j*2+5] = bufferout[i+4][j+WIDTH/(1<<(level+1))+4];  //奇数行偶数列
			buffer[i*2+5][j*2+4] = bufferout[i+LENGTH/(1<<(level+1))+4][j+4];  //偶数行奇数列
			buffer[i*2+4][j*2+4] = bufferout[i+LENGTH/(1<<(level+1))+4][j+WIDTH/(1<<(level+1))+4];// 奇数行奇数列
				
		}		
	}
/******************************************************************************
反解交织完成。以下是行的逆变换。
******************************************************************************/
	for(j = 0;j<WIDTH/(1<<level);j++)
	{// 0 1 2 3 4 5 6 7 8 
		buffer[0][j+4] = buffer[8][j+4];
		buffer[1][j+4] = buffer[7][j+4];
		buffer[2][j+4] = buffer[6][j+4];
		buffer[3][j+4] = buffer[5][j+4];

		//134=128 133=129 132=130 
		buffer[LENGTH/(1<<level)+4][j+4] = buffer[LENGTH/(1<<level)+2][j+4];
		buffer[LENGTH/(1<<level)+5][j+4] = buffer[LENGTH/(1<<level)+1][j+4];
		buffer[LENGTH/(1<<level)+6][j+4] = buffer[LENGTH/(1<<level)][j+4];
		buffer[LENGTH/(1<<level)+7][j+4] = buffer[LENGTH/(1<<level)-1][j+4];
	}
	for(j = 0;j<WIDTH/(1<<level);j++)//
	{
		for(i =1;i<LENGTH/(1<<level)+7;i+=2)//第一步行 2 4 6 8 10 12 -- 508 510 512 514 516 518 
		{//j = 1 3 5 7 9 11 -- 507 509 511 513 515 517 
			bufferout[i][j+4] = ( lifting_factors[4]*buffer[i][j+4]);
			//	buffer[i+4][j] = ( lifting_factors[4]*bufferout[i+4][j]);
		}
		for(i =0;i<LENGTH/(1<<level)+8;i+=2)//第二步行3 5 7 9 11 -- 509 511 513 515 517
		{//j =2 4 6 8 10 -- 508 510 512 514 516
			bufferout[i][j+4] = (-buffer[i][j+4]/lifting_factors[4]);
			//buffer[i+4][j] = (-bufferout[i+4][j]/lifting_factors[4]);
		}
		for(i =1;i<LENGTH/(1<<level)+7;i+=2)//第三步行2 4 6 8 10 12 --508 510 512 514 516 518
		{//j =1 3  5 7 9 11 --507 509 511 513  515 517
			bufferout[i][j+4] = bufferout[i][j+4]-
			lifting_factors[3]*(bufferout[i-1][j+4]+bufferout[i+1][j+4]);//sl1偶数
			//buffer[i+4][j] = buffer[i+4][j]-
			//lifting_factors[3]*(buffer[i+4][j-1]+buffer[i+4][j+1]);//sl1偶数
		}
		for(i =2;i<LENGTH/(1<<level)+6;i+=2)//第四步行3 5 7 9 11 -- 509 511 513 515 517
		{//j = 2 4 6 8 10  -- 508 510 512 514 516
			bufferout[i][j+4] = bufferout[i][j+4]-
			lifting_factors[2]*(bufferout[i-1][j+4]+bufferout[i+1][j+4]);//dl1奇数
			//buffer[i+4][j] = buffer[i+4][j]-
			//lifting_factors[2]*(buffer[i+4][j-1]+buffer[i+4][j+1]);//dl1奇数
		}
		for(i =3;i<LENGTH/(1<<level)+5;i+=2)//第五步行4  6 8 10 -- 510 512 514 516
		{//j = 3 5 7 9 --509 511 513 515
			bufferout[i][j+4] = bufferout[i][j+4]-
			lifting_factors[1]*(bufferout[i-1][j+4]+bufferout[i+1][j+4]);//sl1偶数
			//buffer[i+4][j] = buffer[i+4][j]-
		    //lifting_factors[1]*(buffer[i+4][j-1]+buffer[i+4][j+1]);//sl1偶数	
		}
		for(i =4;i<LENGTH/(1<<level)+4;i+=2)//第六步行 5 7 9  11 13 --511 513 515 
		{//j = 4 6 8 --510 512 514  
		
			bufferout[i][j+4] =  bufferout[i][j+4]-
			lifting_factors[0]*(bufferout[i-1][j+4]+bufferout[i+1][j+4]);//dl1奇数
			//buffer[i+4][j] =  buffer[i+4][j]-
			//lifting_factors[0]*(buffer[i+4][j-1]+buffer[i+4][j+1]);//dl1奇数
		}	
	
	}//每一列的数放入4 5 6 7 8 --130  131 132中
	  //数组中的j = 3 4 5 6 7 - - 129 130 131   ??

/******************************************************************************
以上是行变换的逆变换,以下是列变换的逆变换
******************************************************************************/

	for(i = 0;i<LENGTH/(1<<level);i++)		
	{
		bufferout[i+4][0] = bufferout[i+4][8];
		bufferout[i+4][1] = bufferout[i+4][7];
		bufferout[i+4][2] = bufferout[i+4][6];
		bufferout[i+4][3] = bufferout[i+4][5];
			
		bufferout[i+4][WIDTH/(1<<level)+4] = bufferout[i+4][WIDTH/(1<<level)+2];
		bufferout[i+4][WIDTH/(1<<level)+5] = bufferout[i+4][WIDTH/(1<<level)+1];
		bufferout[i+4][WIDTH/(1<<level)+6] = bufferout[i+4][WIDTH/(1<<level)];
		bufferout[i+4][WIDTH/(1<<level)+7] = bufferout[i+4][WIDTH/(1<<level)-1];
	}
	for(i = 0;i<LENGTH/(1<<level);i++)//行

	{
		for(j =1;j<WIDTH/(1<<level)+7;j+=2)//第一步列 2 4 6 8 10 12 -- 508 510 512 514 516 518 
		{//j = 1 3 5 7 9 11 -- 507 509 511 513 515 517 
			buffer[i+4][j] = ( lifting_factors[4]*bufferout[i+4][j]);
		}

		for(j =0;j<WIDTH/(1<<level)+8;j+=2)//第二步列3 5 7 9 11 -- 509 511 513 515 517
		{//j =2 4 6 8 10 -- 508 510 512 514 516
			buffer[i+4][j] = (-bufferout[i+4][j]/lifting_factors[4]);
		}

		for(j =1;j<WIDTH/(1<<level)+7;j+=2)//第三步列2 4 6 8 10 12 --508 510 512 514 516 518
		{//j =1 3  5 7 9 11 --507 509 511 513  515 517
			buffer[i+4][j] = buffer[i+4][j]-
			lifting_factors[3]*(buffer[i+4][j-1]+buffer[i+4][j+1]);//sl1偶数
		}
		for(j =2;j<WIDTH/(1<<level)+6;j+=2)//第四步列3 5 7 9 11 -- 509 511 513 515 517
		{//j = 2 4 6 8 10  -- 508 510 512 514 516
			buffer[i+4][j] = buffer[i+4][j]-
			lifting_factors[2]*(buffer[i+4][j-1]+buffer[i+4][j+1]);//dl1奇数
		}
		for(j =3;j<WIDTH/(1<<level)+5;j+=2)//第五步列4  6 8 10 -- 510 512 514 516
		{//j = 3 5 7 9 --509 511 513 515
			buffer[i+4][j] = buffer[i+4][j]-
			lifting_factors[1]*(buffer[i+4][j-1]+buffer[i+4][j+1]);//sl1偶数	
		}
		for(j =4;j<WIDTH/(1<<level)+4;j+=2)//第六步列 5 7 9  11 13 --511 513 515 
		{//j = 4 6 8 --510 512 514  		
			buffer[i+4][j] =  buffer[i+4][j]-
			lifting_factors[0]*(buffer[i+4][j-1]+buffer[i+4][j+1]);//dl1奇数
		}	
	
	}//每一列的数放入5 6 7 8 --511 512 513 514中
	  //数组中的j =  4 5 6 7 - - 510 511 512 513

}
#endif
/******************************************************************************
逆变换完成
******************************************************************************/

	for(i = 0;i<LENGTH;i++)
		for(j = 0;j<WIDTH;j++)
		{
			buffer[i+4][j+4] = buffer[i+4][j+4]+128;
//			if(buffer[i+4][j+4] > 255)
//				buffer[i+4][j+4] = 255;
//			else if(buffer[i+4][j+4] < 0)
//				buffer[i+4][j+4] = 0;
			
		}
#ifdef debug
		printf("\n the result number is:");
		for(i = 0;i<LENGTH;i++)
			for(j = 0;j<WIDTH;j++)
			{
				if(!j%8) printf("\n");
				printf("%3d ",(int)(buffer[i+4][j+4]+0.5));
			}
//		for(i = 0;i<LENGTH;i++)
//			for(j = 0;j<WIDTH;j++)
//			{
//				fwrite(&buffer[i][j], 1,1,out);
//			}
//		fclose(out);
#endif	

//	for(i = 0;i<LENGTH;i++)
//		for(j = 0;j<WIDTH;j++)
//		{   
//			unsigdata = floor(buffer[i+4][j+4]+0.5);
//	       	fwrite(&unsigdata,1,1,out);
//		}

//	fclose(inter);
//	fclose(in);
//	fclose(out);

}

/******************************************************************************/
//  输入接口: **m_initialData  该指针指向初始数据(与二维矩阵对应)
//  输入接口: int LENGTH,int NP,int NC,,用来划分矩阵进行小波正逆变换
//            int layer 当前小波变换的层数   
//             short **m_tempStore_pww,用来存储一些变换结果
//  输出接口:short **m_tempStore_pw用来存储一些变换结果
// 
// 时间:2005,05,12
/******************************************************************************/
//*void ldwt(unsigned char **m_initialData,unsigned char **m_tempStore_pw,short **m_tempStore_pww,
//		  int LENGTH,int NP,int MC,int NC,int layer)

⌨️ 快捷键说明

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