📄 main.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 + -