查表法的应用
比较普通算法与查LUT表法计算伽马变换和图像灰度化的快慢程度
- 伽马变换:
void GryImageGamaCorrect_Slow(BYTE *pGryImg,double gama,int nSize)
{
for(int i=0;i<nSize;i++)
{
*(pGryImg+i) = min(255,(int)(pow(*(pGryImg+i),gama)));
}
return;
}
void GryImageGamaCorrect_Fast(BYTE *pGryImg,double gama,int nSize)
{
int LUT[256];
int i;
LUT[0]=0;
for(i=1;i<256;i++) LUT[i]=min(255,(int)(pow(i,gama)));
for(i=0;i<nSize;i++)
{
*(pGryImg+i) = LUT[*(pGryImg+i)];
}
return;
}
在release模式下,用查表法运算一次的时间大约为0.4ms,用普通算法运算一次的时间大约为33ms;
在debug模式下,用查表法运算一次的时间大约为1.5ms,用普通算法运算一次的时间大约为35ms;
2. 图像灰度化:
void RGBImg2GryImg0(BYTE *pRGBImg,int width,int height,BYTE *pGryImg)
{
BYTE *pRGB,*pGry,*pEnd=pRGBImg+3*width*height;
double gry;
for(pRGB=pRGBImg,pGry=pGryImg;pRGB<pEnd;)
{
gry = *(pRGB++)*0.114; //B
gry += *(pRGB++)*0.587; //G
gry += *(pRGB++)*0.299; //R
*(pGry++) = (int)(gry);
}
return;
}
void RGBImg2GryImg1(BYTE *pRGBImg,int width,int height,BYTE *pGryImg)//LUT
{
BYTE *pRGB,*pGry,*pEnd=pRGBImg+3*width*height;
double LUTR[256],LUTG