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

📄 modified_ebcot.c

📁 这是我刚刚完成的关于JPEG2000的C语言实现的部分程序。小波变换是采用97变换
💻 C
📖 第 1 页 / 共 3 页
字号:
					 if(m == 2)
						{						
							fprintf(context,"%d %d ",18,1);
							fprintf(context,"%d %d ",18,0);
						//此时将符号位元编码,有5种可能的情况(9-13)sign coding
						// Encode sign bit
						fprintf(context,"%d %d ",init_sign(f[4*i+m][j],state_data_x[4*i+m][j]),state_data_x[4*i+m][j]);						
						state_data_q[4*i+m][j] = 1;//重要性标志置1
//						state_data_pi[4*i+m-2][j] = 1;//标志此位被访问过。
//						state_data_pi[4*i+m-1][j] = 1;//标志此位被访问过。
//						state_data_pi[4*i+m][j] = 1;//标志此位被访问过。						
						fprintf(context,"%d %d ",init_significant(f[4*i+m+1][j],0),state_data_v[4*i+m+1][j]);
//						state_data_pi[4*i+m+1][j] = 1;//标志此位被访问过。
						if(state_data_v[4*i+m+1][j])
						{
						//此时将符号位元编码,有5种可能的情况(9-13)sign coding
						// Encode sign bit
							fprintf(context,"%d %d ",init_sign(f[4*i+m+1][j],state_data_x[4*i+m+1][j]),state_data_x[4*i+m+1][j]);
							state_data_q[4*i+m+1][j] = 1;//重要性标志置1
						}
						break;
						}
					if(m == 3)
						{
							fprintf(context,"%d %d ",18,1);
							fprintf(context,"%d %d ",18,1);
						//此时将符号位元编码,有5种可能的情况(9-13)sign coding
						// Encode sign bit
						fprintf(context,"%d %d ",init_sign(f[4*i+m][j],state_data_x[4*i+m][j]),state_data_x[4*i+m][j]);						
						state_data_q[4*i+m][j] = 1;//重要性标志置1
//						state_data_pi[4*i+m-3][j] = 1;//标志此位被访问过。
//						state_data_pi[4*i+m-2][j] = 1;//标志此位被访问过。
//						state_data_pi[4*i+m-1][j] = 1;//标志此位被访问过。
//						state_data_pi[4*i+m][j] = 1;//标志此位被访问过。
						break;
						}						
					}//for
				}//for
				continue;
			}//else

			//开始清除通过,此扫描数据没有经过前两个通道则进入清除通道编码
			if(state_data_q[4*i][j]==0 && init_significant(f[4*i][j],0)==0)
			{//当前系数不是重要性系数							
				fprintf(context,"%d %d ",init_significant(f[4*i][j],0),state_data_v[4*i][j]);
				if(state_data_v[4*i][j])
				{
					state_data_q[4*i][j]  = 1;
					//unsigned char init_sign(unsigned int f, unsigned char v,int i,int j)
					fprintf(context,"%d %d ",init_sign(f[4*i][j],state_data_x[4*i][j]),state_data_x[4*i][j]);				
				}
			for(m=1;m<4;m++)	
			{//开始重要性传播位平面的重要性扫描通道,处理当前不显著,但具有显著邻域的样本
				if(state_data_q[4*i+m][j]==0 && init_significant(f[4*i+m][j],0)>0 &&init_significant(f[4*i+m][j],0)<9)
				{//当前系数不是重要性系数,上下文区域不是0							
					fprintf(context,"%d %d ",init_significant(f[4*i+m][j],0),state_data_v[4*i+m][j]);
					if(state_data_v[4*i+m][j])
					{
						state_data_q[4*i+m][j]  = 1;
						//unsigned char init_sign(unsigned int f, unsigned char v,int i,int j)
						fprintf(context,"%d %d ",init_sign(f[4*i+m][j],state_data_x[4*i+m][j]),state_data_x[4*i+m][j]);				
					}
					state_data_pi[4*i+m][j] = 1;
					
				}
				else
					state_data_pi[4*i+m][j] = 0;
			//开始幅值细化通过,位平面的幅度细化扫描通道
				if(state_data_q[4*i+m][j]==1 && state_data_pi[4*i+m][j]==0)  
				{//该系数是重要的,						
					fprintf(context,"%d %d ",init_magnitude(f[4*i+m][j],state_data_e[4*i+m][j]),state_data_v[4*i+m][j]);
					state_data_e[4*i+m][j] = 1;		
				}
				//开始清除通过,此扫描数据没有经过前两个通道则进入清除通道编码
				if(state_data_q[4*i+m][j]==0 && init_significant(f[4*i+m][j],0)==0)
				{//当前系数不是重要性系数							
					fprintf(context,"%d %d ",init_significant(f[4*i+m][j],0),state_data_v[4*i+m][j]);
					if(state_data_v[4*i+m][j])
					{
						state_data_q[4*i+m][j]  = 1;
						//unsigned char init_sign(unsigned int f, unsigned char v,int i,int j)
						fprintf(context,"%d %d ",init_sign(f[4*i+m][j],state_data_x[4*i+m][j]),state_data_x[4*i+m][j]);				
					}					
				}			
			}//for	


		}//else	
	}//else
/******************************************************************************
//环境状态字12位,显示重要性状态值。状态变量如下所示:
// x;//符号变量
// q;//显著性状态变量
// e;//延迟显著性状态变量 表示系数是否是第一次被量值改进,也叫细化信息位
// v;//样本比特值
// pi;//编码状态变量 表示位平面上的比特值是否已经被编码,也叫访问信息位
*******************************************************************************/		
	}
}
//到次为止完成三个通道的编码。
}
	fclose(context);
}


void encode_allsubband(int block_bufferin[BLOCKLENGTH][BLOCKWIDTH],
						float interleave[LENGTH+8][WIDTH+8])
{
	int i,j,m=0,n=0;
//	int image_size = LENGTH*WIDTH;
//	int block_size = BLOCKLENGTH*BLOCKWIDTH;
/*	int blocksample[4][4] = 
	{
		{1,6,-5,0},
		{4,1,7,-4},
		{0,5,-2,-5},
		{-3,4,-3,1}
//		{1,2,3,4},
//		{1,2,3,4},
//		{1,2,3,4},
//		{1,2,3,4}
//		{0,0,0,0},
//		{0,0,0,0},
//		{0,0,0,0},
//		{0,0,0,0}
	};
*/
//	for(m=0;m<LEVE;;m++)
//		for(n=0;n<pow(2,m)*pow(2,m);n++)//1,4,16,64,256
		{
			printf("\nThe block_code sample is:");
			for(i=0;i<BLOCKLENGTH;i++)
    			for(j=0;j<BLOCKWIDTH;j++)
				{
					block_bufferin[i][j] = (floor)(interleave[i+4][j+4]+0.5);					
					//block_bufferin[i][j] = blocksample[i][j];
					if((j%16==0))
					printf("\n");
					printf("%d, ",block_bufferin[i][j]);
					
				}

				block_encode(block_bufferin);
		}
/*
	//for(m=0;m<LEVE;;m++)
//		for(n=0;n<pow(2,m)*pow(2,m);n++)//1,4,16,64,256
		{
			
			for(i=0;i<BLOCKLENGTH;i++)
    			for(j=0;j<BLOCKWIDTH;j++)
				{//执行LL0
					block_bufferin[i][j] = (floor)(interleave[i+4+16*m][j+4+16*m]+0.5);					
					//block_bufferin[i][j] = blocksample[i][j];
					if((j%16==0))
					printf("\n");
					printf("%d, ",block_bufferin[i][j]);
					
				}
				block_encode(block_bufferin);
				if(m==0)
				continue;

				for(i=0;i<BLOCKLENGTH;i++)
    			for(j=0;j<BLOCKWIDTH;j++)
				{HL0 HL1 HL2 HL3 HL4 
					block_bufferin[i][j] = (floor)(interleave[i+4+16*n][j+4+16*n]+0.5);					
					//block_bufferin[i][j] = blocksample[i][j];
					if((j%16==0))
					printf("\n");
					printf("%d, ",block_bufferin[i][j]);
					
				}
				block_encode(block_bufferin);

			

		}
*/
}
/******************************************************************************
以上完成EBCOT的编码,输出送入MQ算术编码器中
******************************************************************************/
void init_environment(unsigned int f[BLOCKLENGTH][BLOCKWIDTH],unsigned char 
	c[BLOCKLENGTH][BLOCKWIDTH],unsigned char state_data_x[BLOCKLENGTH][BLOCKWIDTH])
{
	struct entironment_data
	{
		unsigned  a12:1;
		unsigned  a11:1;
		unsigned  a10:1;
		unsigned  a9:1;
		unsigned  a8:1;
		unsigned  a7:1;
		unsigned  a6:1;
		unsigned  a5:1;
		unsigned  a4:1;
		unsigned  a3:1;
		unsigned  a2:1;
		unsigned  a1:1;
	}state[BLOCKLENGTH][BLOCKWIDTH];
	int i,j;
/******************************************************************************
//环境状态变量              d0  v0  d1    a1  a5  a2             a9
							h0	x	h1	  a7  x   a8       a11   x  a12	
							d2	v1  d3	  a3  a6  a4			a10
******************************************************************************/
	state[0][0].a12 = state_data_x[0][1] & 1;
	state[0][0].a11 = 0;
	state[0][0].a10 = state_data_x[1][0] & 1;
	state[0][0].a9 = 0;
	state[0][0].a8 = c[0][1] & 1;
	state[0][0].a7 = 0;
	state[0][0].a6 = c[1][0] & 1;
	state[0][0].a5 = 0;
	state[0][0].a4 = c[1][1] & 1;
	state[0][0].a3 = 0;
	state[0][0].a2 = 0;
	state[0][0].a1 = 0;

	state[0][BLOCKWIDTH-1].a12 = 0;
	state[0][BLOCKWIDTH-1].a11 = state_data_x[0][BLOCKWIDTH-1-1] & 1;
	state[0][BLOCKWIDTH-1].a10 = state_data_x[1][BLOCKWIDTH-1] & 1;
	state[0][BLOCKWIDTH-1].a9 = 0;
	state[0][BLOCKWIDTH-1].a8 = 0;
	state[0][BLOCKWIDTH-1].a7 = c[0][BLOCKWIDTH-1-1] & 1;
	state[0][BLOCKWIDTH-1].a6 = c[1][BLOCKWIDTH-1] & 1;
	state[0][BLOCKWIDTH-1].a5 = 0;
	state[0][BLOCKWIDTH-1].a4 = 0;
	state[0][BLOCKWIDTH-1].a3 = c[1][BLOCKWIDTH-1-1] & 1;
	state[0][BLOCKWIDTH-1].a2 = 0;
	state[0][BLOCKWIDTH-1].a1 = 0;


	state[BLOCKLENGTH-1][0].a12 = state_data_x[BLOCKLENGTH-1][1] & 1;
	state[BLOCKLENGTH-1][0].a11 = 0;
	state[BLOCKLENGTH-1][0].a10 = 0;
	state[BLOCKLENGTH-1][0].a9 = state_data_x[BLOCKLENGTH-1-1][0] & 1;
	state[BLOCKLENGTH-1][0].a8 = c[BLOCKLENGTH-1][1] & 1;
	state[BLOCKLENGTH-1][0].a7 = 0;
	state[BLOCKLENGTH-1][0].a6 = 0;
	state[BLOCKLENGTH-1][0].a5 = c[BLOCKLENGTH-1-1][0] & 1;
	state[BLOCKLENGTH-1][0].a4 = 0;
	state[BLOCKLENGTH-1][0].a3 = 0;
	state[BLOCKLENGTH-1][0].a2 = c[BLOCKLENGTH-1-1][1] & 1;
	state[BLOCKLENGTH-1][0].a1 = 0;

	state[BLOCKLENGTH-1][BLOCKWIDTH-1].a12 = 0;
	state[BLOCKLENGTH-1][BLOCKWIDTH-1].a11 = state_data_x[BLOCKLENGTH-1][BLOCKWIDTH-1-1] & 1;
	state[BLOCKLENGTH-1][BLOCKWIDTH-1].a10 = 0;
	state[BLOCKLENGTH-1][BLOCKWIDTH-1].a9 = state_data_x[BLOCKLENGTH-1-1][BLOCKWIDTH-1] & 1;
	state[BLOCKLENGTH-1][BLOCKWIDTH-1].a8 = 0;
	state[BLOCKLENGTH-1][BLOCKWIDTH-1].a7 = c[BLOCKLENGTH-1][BLOCKWIDTH-1-1] & 1;
	state[BLOCKLENGTH-1][BLOCKWIDTH-1].a6 = 0;
	state[BLOCKLENGTH-1][BLOCKWIDTH-1].a5 = c[BLOCKLENGTH-1-1][BLOCKWIDTH-1] & 1;
	state[BLOCKLENGTH-1][BLOCKWIDTH-1].a4 = 0;
	state[BLOCKLENGTH-1][BLOCKWIDTH-1].a3 = 0;
	state[BLOCKLENGTH-1][BLOCKWIDTH-1].a2 = 0;
	state[BLOCKLENGTH-1][BLOCKWIDTH-1].a1 = c[BLOCKLENGTH-1-1][BLOCKWIDTH-1-1] & 1;
	
for(j=1;j<BLOCKWIDTH-1;j++)
	{
		state[0][j].a12 = state_data_x[0][j+1] & 1;
		state[0][j].a11 = state_data_x[0][j-1] & 1;
		state[0][j].a10 = state_data_x[1][j] & 1;
		state[0][j].a9 = 0;
		state[0][j].a8 = c[0][j+1] & 1;
		state[0][j].a7 = c[0][j-1] & 1;
		state[0][j].a6 = c[1][j] & 1;
		state[0][j].a5 = 0;
		state[0][j].a4 = c[1][j+1] & 1;
		state[0][j].a3 = c[1][j-1] & 1;
		state[0][j].a2 = 0;
		state[0][j].a1 = 0;
	}
for(j=1;j<BLOCKWIDTH-1;j++)
	{
		state[BLOCKLENGTH-1][j].a12 = state_data_x[BLOCKLENGTH-1][j+1] & 1;
		state[BLOCKLENGTH-1][j].a11 = state_data_x[BLOCKLENGTH-1][j-1] & 1;
		state[BLOCKLENGTH-1][j].a10 = 0;
		state[BLOCKLENGTH-1][j].a9 = state_data_x[BLOCKLENGTH-1-1][j] & 1;
		state[BLOCKLENGTH-1][j].a8 = c[BLOCKLENGTH-1][j+1] & 1;
		state[BLOCKLENGTH-1][j].a7 = c[BLOCKLENGTH-1][j-1] & 1;
		state[BLOCKLENGTH-1][j].a6 = 0;
		state[BLOCKLENGTH-1][j].a5 = c[BLOCKLENGTH-1-1][j] & 1;
		state[BLOCKLENGTH-1][j].a4 = 0;
		state[BLOCKLENGTH-1][j].a3 = 0;
		state[BLOCKLENGTH-1][j].a2 = c[BLOCKLENGTH-1-1][j+1] & 1;
		state[BLOCKLENGTH-1][j].a1 = c[BLOCKLENGTH-1-1][j-1] & 1;
	}
for(i=1;i<BLOCKLENGTH-1;i++)
	{
		state[i][0].a12 = state_data_x[i][1] & 1;
		state[i][0].a11 = 0;
		state[i][0].a10 = state_data_x[i+1][0] & 1;
		state[i][0].a9 = state_data_x[i-1][0] & 1;
		state[i][0].a8 = c[i][1] & 1;
		state[i][0].a7 = 0;
		state[i][0].a6 = c[i+1][0] & 1;
		state[i][0].a5 = c[i-1][0] & 1;
		state[i][0].a4 = c[i+1][1] & 1;
		state[i][0].a3 = 0;
		state[i][0].a2 = c[i-1][1] & 1;
		state[i][0].a1 = 0;
	}
for(i=1;i<BLOCKLENGTH-1;i++)
	{
		state[i][BLOCKWIDTH-1].a12 = 0;
		state[i][BLOCKWIDTH-1].a11 = state_data_x[i][BLOCKWIDTH-1-1] & 1;
		state[i][BLOCKWIDTH-1].a10 = state_data_x[i+1][BLOCKWIDTH-1] & 1;
		state[i][BLOCKWIDTH-1].a9 = state_data_x[i-1][BLOCKWIDTH-1] & 1;
		state[i][BLOCKWIDTH-1].a8 = 0;
		state[i][BLOCKWIDTH-1].a7 = c[i][BLOCKWIDTH-1-1] & 1;
		state[i][BLOCKWIDTH-1].a6 = c[i+1][BLOCKWIDTH-1] & 1;
		state[i][BLOCKWIDTH-1].a5 = c[i-1][BLOCKWIDTH-1] & 1;
		state[i][BLOCKWIDTH-1].a4 = 0;

⌨️ 快捷键说明

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