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

📄 subbandsymbol.c

📁 该程序把数字图像处理与小波变换结合起来
💻 C
字号:
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
/* 
 * Mow-Song, Ng 2/9/2002
 * msng@mmu.edu.my
 * http://www.pesona.mmu.edu.my/~msng
 *
 * I do not claim copyright to the code, but if you use them or modify them,
 * please drop me a mail.
 *
 */
/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/

#include "subbandsymbol.h"

/*----------------------------------------------------------------------------*/	
/*----------------------------------------------------------------------------*/	
SubbandSymbol *SubbandSymbolAlloc(int hsize, int vsize, int nsteps)
{
	SubbandSymbol *symbol;
	int i;
	int *lowHSize, *lowVSize, *highHSize, *highVSize;

	assert(nsteps > 0);

	if ((symbol = (SubbandSymbol *)malloc(sizeof(SubbandSymbol)))==NULL){
		SubbandSymbolError("Fail to allocate symbol.\n");
	}

	symbol->hsize = hsize;
	symbol->vsize = vsize;
	symbol->nsteps = nsteps;

	/* ensure that all status starts with value 0 */
	symbol->symbol = (int *)calloc(symbol->hsize*symbol->vsize, sizeof(int));
	
	symbol->nSubbands		= 3*symbol->nsteps+1;
	symbol->subbandSize	= (int *)calloc(symbol->nSubbands, sizeof(int));
	symbol->subbandHSize = (int *)calloc(symbol->nSubbands, sizeof(int));
	symbol->subbandVSize = (int *)calloc(symbol->nSubbands, sizeof(int));
	symbol->subbandPtr	= (int **)calloc(symbol->nSubbands, sizeof(int *));

	lowHSize = (int *)calloc(symbol->nsteps, sizeof(int));
	lowVSize = (int *)calloc(symbol->nsteps, sizeof(int));
	highHSize = (int *)calloc(symbol->nsteps, sizeof(int));
	highVSize = (int *)calloc(symbol->nsteps, sizeof(int));

	lowHSize[symbol->nsteps-1] = (symbol->hsize+1)/2;
	lowVSize[symbol->nsteps-1] = (symbol->vsize+1)/2;
	highHSize[symbol->nsteps-1] = symbol->hsize/2; 
	highVSize[symbol->nsteps-1] = symbol->vsize/2;
	
	/* set the sizes for each blocks */
	for (i = symbol->nsteps-2; i >= 0; i--) {
		lowHSize[i] = (lowHSize[i+1]+1)/2;
		lowVSize[i] = (lowVSize[i+1]+1)/2;
		highHSize[i] = lowHSize[i+1]/2;
		highVSize[i] = lowVSize[i+1]/2; 
	}
	
	/* subband[0] */
	symbol->subbandPtr[0] = symbol->symbol;
	symbol->subbandHSize[0] = lowHSize[0];
	symbol->subbandVSize[0] = lowVSize[0];
	symbol->subbandSize[0] = symbol->subbandHSize[0]*symbol->subbandVSize[0];
	
	/* all other high pass subbands, do each scale at once */
	for (i = 0; i < symbol->nsteps; i++) {
		symbol->subbandHSize[3*i+1] = highHSize[i];
		symbol->subbandVSize[3*i+1] = lowVSize[i];
		symbol->subbandHSize[3*i+2] = lowHSize[i];
		symbol->subbandVSize[3*i+2] = highVSize[i];
		symbol->subbandHSize[3*i+3] = highHSize[i];
		symbol->subbandVSize[3*i+3] = highVSize[i];
	}
	
	/* set the data pointers */
	for (i = 1; i < symbol->nSubbands; i++) {
		symbol->subbandSize[i] = symbol->subbandHSize[i]*symbol->subbandVSize[i];
		symbol->subbandPtr[i] = symbol->subbandPtr[i-1] + symbol->subbandSize[i-1];
	}
	
	/* release allocated memory */
	free(lowHSize);
	free(lowVSize);
	free(highHSize);
	free(highVSize);
	
	return symbol;
}

/*----------------------------------------------------------------------------*/	
/*----------------------------------------------------------------------------*/	
void SubbandSymbolDealloc(SubbandSymbol *symbol)
{
	if (symbol!=NULL){
		free(symbol->symbol);
		free(symbol->subbandSize);
		free(symbol->subbandHSize);
		free(symbol->subbandVSize);
		free(symbol->subbandPtr);
		free(symbol);
	}
}

/*----------------------------------------------------------------------------*/	
/*----------------------------------------------------------------------------*/	
int SubbandSymbolGetNodeSymbol(SubbandSymbol *symbol, int scale, 
										 int orientation, int x, int y)
{
	int idx;

	if (scale==0){
		idx = 0;	
	}
	else{
		idx = 3*scale - 2 + orientation;
	}
	
	return (symbol->subbandPtr[idx][y*symbol->subbandHSize[idx] + x]);
}

/*----------------------------------------------------------------------------*/	
/*----------------------------------------------------------------------------*/	
void SubbandSymbolSetNodeSymbol(SubbandSymbol *symbol, int scale, 
										  int orientation, int x, int y, int s)
{
	int idx;

	if (scale==0){
		idx = 0;
	}
	else{
		idx = 3*scale - 2 + orientation;
	}

	symbol->subbandPtr[idx][y*symbol->subbandHSize[idx] + x] = s;

	return;
}

/*----------------------------------------------------------------------------*/	
/*----------------------------------------------------------------------------*/	
void SubbandSymbolError(char *fmt, ...)
{
	va_list argptr;
	
	va_start( argptr, fmt );
	fprintf(stderr, "SubbandSymbolError: " );
	vprintf( fmt, argptr );
	va_end( argptr );
	exit( -1 );
}

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

⌨️ 快捷键说明

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