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

📄 main.c

📁 在ccs开发环境下实现的基于dsp的图像二维dct变换和压缩,完整可实现的工程文件, 源文件算法清晰,良好的实现效果
💻 C
字号:
#include "DCTProcess.h"
#include "ImageProcess.h"


#define FRAME_TO_BE_CODED	1


int main()
{
	unsigned short	i=0;
	BYTE 	* pY, * pU, * pV;//Buffer for input image
	BYTE	* pRecon, *	pRes;//Buffer for processed image, spinous, 2005-01-29 DCT
	BYTE	* pNoise;//Buffer for image process, spinous, 2005-01-29 NOISE
	FILE	*in, *recon, *res, *noise, *addnoise, *gray, *oldhis, *newhis;
	BYTE	threshold = 120;//DCT
//	BYTE	power = 32;//NOISE
	int		EquaScale = 256;//HISTOGRAM
//	unsigned int orig_hist[256];//buffer for hist of original image, HISTOGRAM
	unsigned int *new_hist;//buffer for hist of new image, HISTOGRAM

	if ((in = fopen("foreman_cif.yuv", "rb")) == NULL)
	{
		return -1;
	}

	if ((recon = fopen("Recon_image.yuv", "wb")) == NULL)
	{
		return -1;
	}
	
	if ((res = fopen("DCT_residual_image.yuv", "wb")) == NULL)
	{
		return -1;
	}
	
	if ((noise = fopen("noiseImage.yuv", "wb")) == NULL)
	{
		return -1;
	}
	
	if ((addnoise = fopen("addnoiseImage.yuv", "wb")) == NULL)
	{
		return -1;
	}	

	if ((gray = fopen("originalImage.yuv", "wb")) == NULL)
	{
		return -1;
	}	
		
	/*if((oldhis = fopen("oldhistogram.txt", "w")) == NULL)
		exit(0);
	if((newhis = fopen("newhistogram.txt", "w")) == NULL)
		exit(0);
		*/

//Input YUV buffer	
	pY = (BYTE *)calloc(Y_SIZE, sizeof(BYTE));
	pU = (BYTE *)calloc(UV_SIZE, sizeof(BYTE));
	pV = (BYTE *)calloc(UV_SIZE, sizeof(BYTE));
	
	pRecon = (BYTE *)calloc(YUV_SIZE, sizeof(BYTE));//Reconstructed image buffer
	pRes = (BYTE *)calloc(YUV_SIZE, sizeof(BYTE));
	pNoise = (BYTE *)calloc(YUV_SIZE, sizeof(BYTE));
	
	new_hist = (unsigned int*)calloc(EquaScale, sizeof(unsigned int));
	
	if (pY == NULL || pU == NULL ||pV == NULL ||pRecon == NULL ||pRes == NULL 
			||pNoise == NULL ||new_hist == NULL)
	{
		return -1;
	}

	Init_Process(SF_CIF);//For image format initial, spinous, 2005-01-29

#ifdef NOISE
	//产生随机噪声图像random image
	//generate the random noise
	//pNoise is the buffer
	//power is the parameter of noise, belonging to the interval [0, 255],usually set to 128 or 64
	RandImage(pNoise,power);
	fwrite(pNoise,sizeof(unsigned char),YUV_SIZE,noise);
#endif
	
	do
	{
	    fread( pY, sizeof(BYTE), Y_SIZE, in);
	    fread( pU, sizeof(BYTE), UV_SIZE, in);
	    fread( pV, sizeof(BYTE), UV_SIZE, in);
//spinous, 2005-01-28
//threshold为DCT变换之后系数置零的门限参数
//	越大,DCT之后的精度损失越大,但是压缩效果越好,信息损失变大,重建图像质量越差
//	越小,DCT之后的精度损失越小,压缩效果下降,信息丢失小,重建图像质量好
//	threshold的取值范围:[0, 200]
#ifdef DCT_PROCESS
		DCTProcess(pY,pU,pV,pRecon, pRes, threshold);
		
		fwrite(pRecon, sizeof(BYTE), YUV_SIZE, recon);
		fwrite(pRes, sizeof(BYTE), YUV_SIZE, res);
#endif		

#ifdef NOISE
//在采集的图像上添加随机噪声,注意这里添加的噪声和RandImage函数产生的噪声不同,是两个独立的噪声
//这两个程序可以分开调用        
		//generate the image with random noise
		//pNoise is the buffer
		//power is the parameter of noise, belonging to the interval [0, 255],usually set to 128 or 64
		AddRandNoise(pY,pU,pV,pRecon,pRes,power);
		
		fwrite(pRes,sizeof(unsigned char),YUV_SIZE,addnoise);
		fwrite(pRecon,sizeof(unsigned char),YUV_SIZE,recon); 
#endif

#ifdef HISTOGRAM
		//直方图均衡,得到均衡之后的图像,保留了原始图像和均衡后图像的直方图
		HistEqualize( pY,pU,pV,pRes,pRecon,EquaScale,orig_hist,new_hist);
  
		fwrite(pRes,sizeof(BYTE),YUV_SIZE,gray);//得到原始YUV的灰度图象
		fwrite(pRecon,sizeof(BYTE),YUV_SIZE,recon);//直方图均衡后的图像序列
		
		for(j=0;j<256;j++)
			fprintf(oldhis,"orig_hist[%d]=\t%d\n",j,orig_hist[j]);
		for(j=0;j<EquaScale;j++)
			fprintf(newhis,"new_hist[%d]=\t%d\n",j,new_hist[j]);

#endif

#ifdef FILTER
		//CoefArray is the 4x4 filtering array, it could be changed with different filter algorithm
		SpaceFilter(pY,pU,pV,pRecon,CoefArray);
		//将输出的图像写入文件 
		fwrite(pRecon,sizeof(BYTE),YUV_SIZE,recon);  
#endif
		i++;
	}while(i-FRAME_TO_BE_CODED);
	
	free(pY);
	free(pU);
	free(pV);
	free(pRecon);
	free(pRes);
	free(pNoise);
	free(new_hist);
	
	fclose(in);
	fclose(recon);
	fclose(res);
	fclose(noise);
	fclose(gray);

	return(TRUE);
}

⌨️ 快捷键说明

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