📄 imageprocess.c
字号:
#include <stdlib.h>
#include <stdio.h>
#include "ImageProcess.h"
FILE *Ifp, *Ofp1,*Ofp2,*Ofp3,*Ofp4;
FILE *fp1,*fp2,*fp3,*fp4,*fp5,*fp6;
#ifdef HISTOGRAM
//输入:pYuv原始彩色图像 bufferize:width*height*3/2,包括YUV分量
//输入:width,height:输入图像的宽和高,如176,144
//输入:EquaScale:直方图均衡化的新灰度级,须为2^n
//输出:orig_hist:原始图像的灰度图对应的直方图,buffersize:256 默认原始灰度级为256
//输出:new_hist:均衡化后的直方图,buffersize:Equalscale
//输出:oldYuv原始图像对应的灰度图,buffersize:width*height*3/2,Y分量和pYuv相同
//输出:newYuv经直方图均衡化后的灰度图,buffersize:width*height*3/2
//将输出buffer写入文件可以看到对应的图像或者直方图数据
void HistEqualize(BYTE *pY,BYTE *pU,BYTE *pV,//input Image
BYTE *oldYuv,//原始YUV图像的灰度图象
BYTE *newYuv, //Recon Image
int EquaScale, //should no more than 256
unsigned int *orig_hist, //[256]
unsigned int *new_hist // [EquaScale]
)
{
int i,ii,k;
unsigned char *oldpp,*pp,*newpp;
unsigned char oldgray,newgray;
unsigned int newGrayIndex[256];
unsigned int tmpGray[256];
unsigned int tmp_hist[256];
//set hist zero
for(i=0;i<256;i++) orig_hist[i]=0;
for(i=0;i<EquaScale;i++) new_hist[i]=0;
//get old grayimage
oldpp = oldYuv;
pp = pY;
//Y =pYuv
for (i = 0; i < Y_SIZE; i++) *(oldpp++)=*(pp++);
//UV=128
for (i=0;i<(Y_SIZE>>1);i++) *(oldpp++)=128;
//get original histogram
pp=pY;
for (i = 0; i < Y_SIZE; i++)
{
oldgray = *(pp++);
orig_hist[oldgray] ++;
}
//do histogram equalization
for(i=0;i<256;i++) tmp_hist[i] = orig_hist[i];
for(i=1; i<256; i++) tmp_hist[i] += tmp_hist[i-1];
for(i=0; i<256; i++) tmpGray[i] = tmp_hist[i]*(EquaScale-1);
//get new grayindex
for(i=0,ii=0;i<256;i++)
{
if(tmpGray[i]<(Y_SIZE>>1))
{
newGrayIndex[i]=0;
}
else
{
ii=i;
break;
}
}
for(i=ii,k=1;i<256;i++)
{
if((tmpGray[i] >= (k*Y_SIZE-(Y_SIZE>>1)))&&(tmpGray[i]< (k*Y_SIZE+(Y_SIZE>>1))))
{
newGrayIndex[i]=k;
}
else
{
k++;
i--;
}
}
//get newImage
pp=pY;
newpp=newYuv;
for(i=0;i<Y_SIZE;i++)
{
oldgray = *(pp++);
newgray =newGrayIndex[oldgray];
*(newpp++)=newgray;
}
for (i=0; i<(Y_SIZE>>1); i++) *(newpp++)=128;
//get the equalized histogram
newpp=newYuv;
for (i = 0; i < Y_SIZE; i++)
{
newgray = *(newpp++);
new_hist[newgray] ++;
}
}
#endif
#ifdef NOISE
//产生均匀分布的随机噪声图像
//输入:width,height:图像的宽和长
//输入:range 产生随机噪声的强度
//输出:noiseYuv:均匀分布的随机噪声图像,灰度图,buffersize:width*height*3/2,
void RandImage( BYTE *noiseYuv, //output noiseImage
int range //input:random range
)
{
unsigned char *noisepp;
int i,tmpn;
srand(time(NULL));
noisepp=noiseYuv;
for(i=0;i<Y_SIZE;i++)
{
tmpn= rand()%range+128;
if(tmpn <= 255)
{*(noisepp ++ )=tmpn;}
else
{*(noisepp ++ )= 255; }
}
for(i=0;i<(Y_SIZE>>1);i++)
{
*(noisepp ++ )=128;
}
}
//在输入图像上加入均匀分布的随机噪声
//输入:pYuv原始彩色图像,buffersize:width*height*3/2
//输入:width,height 输入图像的宽和长
//输入:range 添加噪声的强度
//输出:oldYuv:输入彩色图像的灰度图象:width*height*3/2
//输出:newYuv:输出添加了噪声的灰度图象:width*height*3/2
//输出:noiseYuv:添加的噪声图像 buffersize:width*height*3/2
void AddRandNoise( BYTE *pY, BYTE *pU, BYTE *pV,//input
unsigned char *newYuv, //output the recon image
unsigned char *noiseYuv, //output the addnoise image
int range //noise range
)
{
int i;
int sum;
BYTE *ppY=pY, *ppU=pU, *ppV=pV, *newpp=newYuv,*noisepp=noiseYuv;
srand(time(NULL));
for(i=0;i<Y_SIZE;i++)
{
*(noisepp ++ ) = rand()%range;
}
for(i=0;i<UV_SIZE<<1;i++)
*noisepp ++ =128;
noisepp=noiseYuv;
for(i=0;i<Y_SIZE;i++)
{
sum=*(ppY ++ ) + *(noisepp++) ;
if(sum >=255)
{
*(newpp ++ ) = 255;
}
else
{
*(newpp ++ ) = sum;
}
}
for(i=0;i<UV_SIZE;i++)
*newpp++ = *ppU++;
for(i=0;i<UV_SIZE;i++)
*newpp++ = *ppV++;
}
#endif
#ifdef FILTER
//空间滤波,模板大小4x4,对均值滤波模板为全1
//输入:pYuv:输入图像
//输入:CoeffArray:滤波模板系数,1x16数组,a[4][4]排列方法为{a[0][0],a[0][1],a[0][2],...,a[3][2],a[3][3]}
//输入:width,height:输入图像的宽和长
//输出:newYuv:经滤波后的彩色图像
int CoefArray[16]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};//{a[0][0],a[0][1],a[0][2]...a[3][2],a[3][3]}
void SpaceFilter(BYTE *pY,BYTE *pU,BYTE *pV,//input Image
BYTE *newYuv
)
{
/* unsigned char *pp, *ppU=pU, *ppV=pV,*newpp;//,*oldpp;
int tmpNum;
int i,x,y;
//do filter to Y
for(y=0; y<DATA_LINES-3; y++)
for(x=0; x<DATA_PELS-3; x++)
{
newpp = newYuv + y*DATA_PELS +x;
pp = pY + y*DATA_PELS +x;
tmpNum = (*(pp++))*CoefArray[0];
tmpNum += (*(pp++))*CoefArray[1];
tmpNum += (*(pp++))*CoefArray[2];
tmpNum += (*(pp++))*CoefArray[3];
pp = pY + (y+1)*DATA_PELS +x;
tmpNum += (*(pp++))*CoefArray[4];
tmpNum += (*(pp++))*CoefArray[5];
tmpNum += (*(pp++))*CoefArray[6];
tmpNum += (*(pp++))*CoefArray[7];
pp = pY + (y+2)*DATA_PELS +x;
tmpNum += (*(pp++))*CoefArray[8];
tmpNum += (*(pp++))*CoefArray[9];
tmpNum += (*(pp++))*CoefArray[10];
tmpNum += (*(pp++))*CoefArray[11];
pp = pY + (y+3)*DATA_PELS +x;
tmpNum += (*(pp++))*CoefArray[12];
tmpNum += (*(pp++))*CoefArray[13];
tmpNum += (*(pp++))*CoefArray[14];
tmpNum += (*(pp++))*CoefArray[15];
tmpNum =tmpNum>>4; //1/16
//check if overflow
if(tmpNum > 255) *newpp=255;
else *newpp=tmpNum;
}
for(y=DATA_LINES-3; y<DATA_LINES; y++)
for(x=DATA_PELS-3; x<DATA_PELS; x++)
{
newpp = newYuv + y*DATA_LINES +x;
*newpp = 0;
}
//set U V
newpp = newYuv + Y_SIZE;
for(i=0;i<UV_SIZE;i++)
*newpp++ = *ppU++;
for(i=0;i<UV_SIZE;i++)
*newpp++ = *ppV++;
*/
unsigned char *pp,*ppU=pU, *ppV=pV,*newpp;//,*oldpp;
int tmpNum;
int i,x,y;
//do filter to Y
for(y=0; y<DATA_LINES-3; y++)
for(x=0; x<DATA_PELS-3; x++)
{
newpp = newYuv + y*DATA_PELS +x;
pp = pY + y*DATA_PELS +x;
tmpNum = (*(pp++))*CoefArray[0];
tmpNum += (*(pp++))*CoefArray[1];
tmpNum += (*(pp++))*CoefArray[2];
tmpNum += (*(pp++))*CoefArray[3];
pp = pY + (y+1)*DATA_PELS +x;
tmpNum += (*(pp++))*CoefArray[4];
tmpNum += (*(pp++))*CoefArray[5];
tmpNum += (*(pp++))*CoefArray[6];
tmpNum += (*(pp++))*CoefArray[7];
pp = pY + (y+2)*DATA_PELS +x;
tmpNum += (*(pp++))*CoefArray[8];
tmpNum += (*(pp++))*CoefArray[9];
tmpNum += (*(pp++))*CoefArray[10];
tmpNum += (*(pp++))*CoefArray[11];
pp = pY + (y+3)*DATA_PELS +x;
tmpNum += (*(pp++))*CoefArray[12];
tmpNum += (*(pp++))*CoefArray[13];
tmpNum += (*(pp++))*CoefArray[14];
tmpNum += (*(pp++))*CoefArray[15];
tmpNum =tmpNum>>4; //*1/16
//check if overflow
if(tmpNum > 255) *newpp=255;
else *newpp=tmpNum;
}
for(y=DATA_LINES-3; y<DATA_LINES; y++)
for(x=DATA_PELS-3; x<DATA_PELS; x++)
{
newpp = newYuv + y*DATA_PELS +x;
*newpp = 0;
}
//set U V
newpp = newYuv + Y_SIZE;
// pp = pYuv + Y_size;
for(i=0;i<UV_SIZE;i++)
{
*(newpp ++ )=*(ppU++);
}
for(i=0;i<UV_SIZE;i++)
{
*(newpp ++ )=*(ppV++);
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -