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

📄 ezw.cpp

📁 单独的ezw编解码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
         
         if (EZWHilbertScan(coder, level-1, LS, n, x, y, LastScanSig)){
            return 1;
         }
         MoveRight(x, y);
         if (EZWHilbertScan(coder, level-1, DS, n, x, y, LastScanSig)){
            return 1;
         }
      }
      break;

   case US:
      if (level<2){
         if (EZWProcessNode(coder, n, *x, *y, LastScanSig)){
            return 1;
         }
         MoveUp(x, y);         
         if (EZWProcessNode(coder, n, *x, *y, LastScanSig)){
            return 1;
         }
         MoveLeft(x, y);        
         if (EZWProcessNode(coder, n, *x, *y, LastScanSig)){
            return 1;
         }
         MoveDown(x, y);         
         if (EZWProcessNode(coder, n, *x, *y, LastScanSig)){
            return 1;
         }         
      }
      else{
         if (EZWHilbertScan(coder, level-1, LS, n, x, y, LastScanSig)){
            return 1;
         }
         MoveUp(x, y);                  
         if (EZWHilbertScan(coder, level-1, US, n, x, y, LastScanSig)){
            return 1;
         }
         MoveLeft(x, y);         
         if (EZWHilbertScan(coder, level-1, US, n, x, y, LastScanSig)){
            return 1;
         }
         MoveDown(x, y);        
         if (EZWHilbertScan(coder, level-1, RS, n, x, y, LastScanSig)){
            return 1;
         }
      }

      break;

   case DS:
      if (level<2){
         if (EZWProcessNode(coder, n, *x, *y, LastScanSig)){
            return 1;
         }
         MoveDown(x, y);         
         if (EZWProcessNode(coder, n, *x, *y, LastScanSig)){
            return 1;
         }
         MoveRight(x, y);         
         if (EZWProcessNode(coder, n, *x, *y, LastScanSig)){
            return 1;
         }
         MoveUp(x, y);
         if (EZWProcessNode(coder, n, *x, *y, LastScanSig)){
            return 1;
         }         
      }
      else{
         if (EZWHilbertScan(coder, level-1, RS, n, x, y, LastScanSig)){
            return 1;
         }
         MoveDown(x, y);         
         if (EZWHilbertScan(coder, level-1, DS, n, x, y, LastScanSig)){
            return 1;
         }
         MoveRight(x, y);         
         if (EZWHilbertScan(coder, level-1, DS, n, x, y, LastScanSig)){
            return 1;
         }
         MoveUp(x, y);
         if (EZWHilbertScan(coder, level-1, LS, n, x, y, LastScanSig)){
            return 1;
         }
      }

      break;

   default:
      Error("Scan direction is not defined.\n");
   }

   return 0;

}

/*--------------------------------------------------------------------------------------------*/
int EZWSortingPassHilbertScan(Coder *coder, int n)
{
   int x, y, level;
   int LastScanSig;
 
   LastScanSig = 0;

   // determine the level
   level = Log2((coder->SubbandXSize[n] >= coder->SubbandYSize[n] ?
                  coder->SubbandXSize[n]-1 : coder->SubbandYSize[n]-1))+1;

   // first point
   x = 0;
   y = 0;
   LastScanSig = 0;

   EZWHilbertScan(coder, level, ((level%2)? RS : DS), n, &x, &y, &LastScanSig);
   
   return 0;
}

/*--------------------------------------------------------------------------------------------*/
int EZWSortingPass(Coder *coder)
{
   int n;

   int (*EZWLLScan)(Coder *, int);
   int (*EZWHLScan)(Coder *, int);
   int (*EZWLHScan)(Coder *, int);
   int (*EZWHHScan)(Coder *, int);

   //---------------------------------------------------------------------
   EZWLLScan = EZWSortingPassHilbertScan;
   EZWHLScan = EZWSortingPassVerticalScan;
   EZWLHScan = EZWSortingPassHorizontalScan;
   EZWHHScan = EZWSortingPassHilbertScan;

   // LL
   if (EZWLLScan(coder, 0)){
      return 1;
   }

   for (n=1; n<coder->nSubbands; n+=3){

      // HL
      if (EZWHLScan(coder, n)){
         return 1;
      }
      // LH
      if (EZWLHScan(coder, n+1)){
         return 1;
      }
      // HH
      if (EZWHHScan(coder, n+2)){
         return 1;
      }
   }

   return 0;
}

/*--------------------------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------------------------*/
/* The newly significant coefficients are refined in this pass */
int EZWRefinementPass(Coder *coder)
{
  	ListData *Data;
	DListElement *current; 
	int bitn, sign;
	int p, lp;
	
	current = DListHead(&coder->LSP);

	lp = coder->MaxBitPlane - coder->CurrentBitPlane;

	for (p=0; p<lp; p++){
		
      while(current != coder->RefinementMark[p]->next){
		
			Data = (ListData *)current->data;
			
			assert(CHKBIT(coder->State[Data->n][Data->i], CSIG_CTX_BIT));
			
			if (coder->Mode == ENCODE){

				bitn = (coder->Magnitude[Data->n][Data->i] & coder->CurrentThreshold);
				bitn = (bitn == 0? 0 : 1);
      		
				if(EZWWSymbol(coder,bitn)){
					return 1;
				}
      		
			}
			else{
				
				if (EZWRSymbol(coder,&bitn)) {
					return 1;
				}
								
				/* compute the refined index */
				coder->Magnitude[Data->n][Data->i] <<= 1;
				coder->Magnitude[Data->n][Data->i] += bitn;

				sign = (CHKBIT(coder->State[Data->n][Data->i], SIGN_CTX_BIT) ? 1 : -1);

				coder->SubbandPtr[Data->n][Data->i] 
					= sign*(int)EZWDequantize(coder->Magnitude[Data->n][Data->i], 
                                       coder->CurrentThreshold, GAMMA);
			}

			coder->nRF++;

			current = current->next;	/* move on to next node */
		}
	}

	coder->RefinementMark[coder->MaxBitPlane-coder->CurrentBitPlane] = DListTail(&coder->LSP);

   return 0;
}

/*--------------------------------------------------------------------------------------------*/

/*--------------------------------------------------------------------------------------------*/
void EZWBuildCodingArrays(Coder *coder,int *ezwcomp)
{	
	int n, i, j, k, Size;
	int xsize,ysize;
	int add = 1 << coder->NScale;

	coder->SubbandXSize = (int *)calloc(coder->nSubbands, sizeof(int));
	TEST_MALLOC(coder->SubbandXSize);
	
	coder->SubbandYSize = (int *)calloc(coder->nSubbands, sizeof(int));
	TEST_MALLOC(coder->SubbandYSize);
	
	coder->SubbandSize = (int *)calloc(coder->nSubbands, sizeof(int));
	TEST_MALLOC(coder->SubbandSize);
	
	//process the image size
	//coder->FXSize,coder->FYSize图像实际大小
	coder->ImageXSize = coder->FXSize;
	coder->ImageYSize = coder->FYSize;
	if ((coder->ImageXSize>>(coder->NScale))<<(coder->NScale) != coder->ImageXSize){		
		coder->ImageXSize = ((coder->ImageXSize>>(coder->NScale))<<(coder->NScale)) + add;
		if((coder->ImageYSize>>(coder->NScale))<<(coder->NScale) != coder->ImageYSize){			
			coder->ImageYSize = ((coder->ImageYSize>>(coder->NScale))<<(coder->NScale)) + add;
		}
	}

	coder->Coeff=(int *)calloc(coder->ImageXSize*coder->ImageYSize, sizeof(int));

	coder->SubbandPtr = (int **)calloc(coder->nSubbands, sizeof(int *));

	//分配自带大小
	xsize = coder->ImageXSize;
	ysize = coder->ImageYSize;
	for(i = coder->NScale-1; i >= 0; i--)
	{
		coder->SubbandXSize[3*i+1] = (xsize >>= 1);
		coder->SubbandYSize[3*i+1] = (ysize >>= 1);
		
		coder->SubbandXSize[3*i+2] = xsize;
		coder->SubbandYSize[3*i+2] = ysize;
		
		coder->SubbandXSize[3*i+3] = xsize;
		coder->SubbandYSize[3*i+3] = ysize;
	}
	coder->SubbandXSize[0] = xsize;
	coder->SubbandYSize[0] = ysize;

	coder->SubbandSize[0] = coder->SubbandXSize[0]*coder->SubbandYSize[0];
	
	/* move transformed image (in Mallat order) into linear array structure */
	/* special case for LL subband */
	coder->SubbandPtr[0] = coder->Coeff;
	for (i = 1; i < coder->nSubbands; i++) {
		coder->SubbandSize[i] = coder->SubbandXSize[i]*coder->SubbandYSize[i];
		coder->SubbandPtr[i] = coder->SubbandPtr[i-1] + coder->SubbandSize[i-1];
	}
	for (j = 0; j < coder->SubbandYSize[0]; j++){
		for (i = 0; i < coder->SubbandXSize[0]; i++){
			coder->SubbandPtr[0][j*coder->SubbandXSize[0]+i] = ezwcomp[j*coder->FXSize+i];
		}
	}
	
	for (k = 0; k < coder->NScale-1; k++) {
		for (j = 0; j < coder->SubbandYSize[3*k+1]; j++){
			for (i = 0; i < coder->SubbandXSize[3*k+1]; i++){
				coder->SubbandPtr[3*k+1][j*coder->SubbandXSize[3*k+1]+i] =
					ezwcomp[j*coder->FXSize+(coder->SubbandXSize[3*k+1]+i)];
			}
		}
		
		for (j = 0; j < coder->SubbandYSize[3*k+2]; j++){
			for (i = 0; i < coder->SubbandXSize[3*k+2]; i++){
				coder->SubbandPtr[3*k+2][j*coder->SubbandXSize[3*k+2]+i] = 
					ezwcomp[(coder->SubbandYSize[3*k+2]+j)*coder->FXSize+i];
			}
		}
		
		for (j = 0; j < coder->SubbandYSize[k*3+3]; j++){
			for (i = 0; i < coder->SubbandXSize[k*3+3]; i++){
				coder->SubbandPtr[3*k+3][j*coder->SubbandXSize[k*3+3]+i] = 
					ezwcomp[(coder->SubbandYSize[k*3+3]+j)*coder->FXSize+(coder->SubbandXSize[k*3+3]+i)];
			}
		}
	}
	/*highest pass*/
	/*如果图像需要宽展,多余的部分补零*/
	k=coder->NScale -1;
	for(j = 0; j < coder->SubbandYSize[3*k+1]; j++){
		for(i = 0; i < coder->FXSize-coder->SubbandXSize[3*k+1];i++){
			coder->SubbandPtr[3*k+1][j*coder->SubbandXSize[3*k+1]+i] =
				ezwcomp[j*coder->FXSize+(coder->SubbandXSize[3*k+1]+i)];
		}
	}
	for(j = 0; j < coder->FYSize-coder->SubbandYSize[3*k+2]; j++){
		for(i = 0; i < coder->SubbandXSize[3*k+2];i++){
			coder->SubbandPtr[3*k+2][j*coder->SubbandXSize[3*k+2]+i] = 
				ezwcomp[(coder->SubbandYSize[3*k+2]+j)*coder->FXSize+i];
		}
	}
	for(j = 0; j < coder->FYSize-coder->SubbandYSize[k*3+3]; j++){
		for(i = 0; i < coder->FXSize-coder->SubbandXSize[k*3+3]; i++){
			coder->SubbandPtr[3*k+3][j*coder->SubbandXSize[k*3+3]+i] = 
				ezwcomp[(coder->SubbandYSize[k*3+3]+j)*coder->FXSize+(coder->SubbandXSize[k*3+3]+i)];
		}
	}


	coder->Magnitude = (int **)calloc(coder->nSubbands, sizeof(int *)); 
	TEST_MALLOC(coder->Magnitude);
	
	if (coder->Mode == ENCODE){
		coder->MaxMagnitude = (int **)calloc(coder->nSubbands, sizeof(int *)); 
		TEST_MALLOC(coder->MaxMagnitude);
	}
	else{
		coder->MaxMagnitude = NULL;
	}
	
	coder->State = (unsigned int **)calloc(coder->nSubbands, sizeof(unsigned int *)); 
	TEST_MALLOC(coder->State);
	
	for (n=0; n<coder->nSubbands; n++){

		Size = coder->SubbandSize[n];		

		coder->Magnitude[n]  = (int *)calloc(Size, sizeof(int));
		TEST_MALLOC(coder->Magnitude[n]);
		
		coder->MaxMagnitude[n] = (int *)calloc(Size, sizeof(int));
		TEST_MALLOC(coder->MaxMagnitude[n]);	
		
		coder->State[n] = (unsigned int *)calloc(Size, sizeof(unsigned int));
		TEST_MALLOC(coder->State[n]);		
	}
	
	return;

}
void EZWDeBuildCodingArrays(Coder *coder)
{	
	int n, Size,i;
	int add = 1 << coder->NScale;
	int xsize,ysize;
	
	coder->SubbandXSize = (int *)calloc(coder->nSubbands, sizeof(int));
	TEST_MALLOC(coder->SubbandXSize);
	
	coder->SubbandYSize = (int *)calloc(coder->nSubbands, sizeof(int));
	TEST_MALLOC(coder->SubbandYSize);
	
	coder->SubbandSize = (int *)calloc(coder->nSubbands, sizeof(int));
	TEST_MALLOC(coder->SubbandSize);

	coder->Coeff=(int *)calloc(coder->ImageXSize*coder->ImageYSize, sizeof(int));

	coder->SubbandPtr = (int **)calloc(coder->nSubbands, sizeof(int *));

	//coder->FXSize,coder->FYSize图像实际大小
	coder->ImageXSize = coder->FXSize;
	coder->ImageYSize = coder->FYSize;
	if ((coder->ImageXSize>>(coder->NScale))<<(coder->NScale) != coder->ImageXSize){		
		coder->ImageXSize = ((coder->ImageXSize>>(coder->NScale))<<(coder->NScale)) + add;
		if((coder->ImageYSize>>(coder->NScale))<<(coder->NScale) != coder->ImageYSize){			
			coder->ImageYSize = ((coder->ImageYSize>>(coder->NScale))<<(coder->NScale)) + add;
		}
	}
	
	coder->Coeff=(int *)calloc(coder->ImageXSize*coder->ImageYSize, sizeof(int));
	
	coder->SubbandPtr = (int **)calloc(coder->nSubbands, sizeof(int *));
	
	//分配子带大小
	xsize = coder->ImageXSize;
	ysize = coder->ImageYSize;
	for(i = coder->NScale-1; i >= 0; i--)
	{
		coder->SubbandXSize[3*i+1] = (xsize >>= 1);
		coder->SubbandYSize[3*i+1] = (ysize >>= 1);
		
		coder->SubbandXSize[3*i+2] = xsize;
		coder->SubbandYSize[3*i+2] = ysize;
		
		coder->SubbandXSize[3*i+3] = xsize;
		coder->SubbandYSize[3*i+3] = ysize;
	}
	coder->SubbandXSize[0] = xsize;
	coder->SubbandYSize[0] = ysize;
	
	coder->SubbandSize[0] = coder->SubbandXSize[0]*coder->SubbandYSize[0];	
		
	/* set the data pointers */
	coder->SubbandPtr[0] = coder->Coeff;
	for (i = 1; i < coder->nSubbands; i++) {
		coder->SubbandSize[i] = coder->SubbandXSize[i]*coder->SubbandYSize[i];
		coder->SubbandPtr[i] = coder->SubbandPtr[i-1] + coder->SubbandSize[i-1];
	}
	
	coder->Magnitude = (int **)calloc(coder->nSubbands, sizeof(int *)); 
	TEST_MALLOC(coder->Magnitude);
	
	if (coder->Mode == ENCODE){
		coder->MaxMagnitude = (int **)calloc(coder->nSubbands, sizeof(int *)); 
		TEST_MALLOC(coder->MaxMagnitude);
	}
	else{
		coder->MaxMagnitude = NULL;
	}
	
	coder->State = (unsigned int **)calloc(coder->nSubbands, sizeof(unsigned int *)); 
	TEST_MALLOC(coder->State);
	
	for (n=0; n<coder->nSubbands; n++){

		Size = coder->SubbandSize[n];
		
		coder->Magnitude[n]  = (int *)calloc(Size, sizeof(int));
		TEST_MALLOC(coder->Magnitude[n]);		
			
		coder->State[n] = (unsigned int *)calloc(Size, sizeof(unsigned int));
		TEST_MALLOC(coder->State[n]);		
	}
	
	return;
	
}
/*--------------------------------------------------------------------------------------------*/
void EZWDestroyCodingArrays(Coder *coder)
{
		int n;

	for (n=0; n<coder->nSubbands; n++){
	
		free(coder->Magnitude[n]);
		
		if (coder->Mode == ENCODE){
			free(coder->MaxMagnitude[n]);
		}
		
		free(coder->State[n]);
	}

	free(coder->Magnitude);
	
	if (coder->Mode == ENCODE){
		free(coder->MaxMagnitude);
	}
	
	free(coder->SubbandSize);
//	free(coder->SubbandXSize);
//	free(coder->SubbandYSize);
	free(coder->State);

	return;

}

/*--------------------------------------------------------------------------------------------*/
void EZWComputeMaxMagnitudeTree(Coder *coder)
{
	int cn, n, i;
	int index, MaxMag;
	int x, y, bx, by;
	int cXSize;	

	assert(coder->Mode == ENCODE);
	
	fprintf(stdout, "Build maximum magnitude array and perform quantization ...\n");
	
	/* highest scale */
	for (n = coder->nSubbands-1; n > coder->nSubbands-4; n--){
		
      i = 0;
		for (y=0; y<coder->SubbandYSize[n]; y++){
			for (x=0; x<coder->SubbandXSize[n]; x++){
				
            index = EZWQuantize(coder->SubbandPtr[n][i], 1.0);
				
            coder->Magnitude[n][i] = abs(index);
				
            if (SIGN(index) > 0){
               coder->State[n][i] = SETBIT(coder->State[n][i], SIGN_CTX_BIT);
            }
            
            if (coder->Magnitude[n][i]>0){              
               coder->MaxMagnitude[n][i] = SETBIT(coder->MaxMagnitude[n][i], 

⌨️ 快捷键说明

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