void BuildTable(float fPrecompensation )
{
int i;
float f;
for( i=0;i<256;i++)
{
f=(i+0.5F)/256;//归一化
f=(float)pow(f,fPrecompensation);
g_GammaLUT[i]=(UNIT8)(f*256-0.5F);//反归一化
}
}
// 伽马变换函数(查表法)
void GammaCorrectiom(unsigned char *src, int iWidth,int iHeight,float fGamma)
{
int iCols,iRows;
BuildTable(1/fGamma);//gamma校正查找表初始化
//对图像的每个像素进行查找表矫正
for(iRows=0;iRows<iHeight;iRows++)
{
for(iCols=0;iCols<iWidth;iCols++)
{
src[iRows*iWidth+iCols]=g_GammaLUT[src[iRows*iWidth+iCols]];
}
}
}
// 伽马变换函数
void gammaCorrection(unsigned char* image, int width, int height, double gamma) {
// 遍历图像的每个像素
for (int y = 0; y < height; ++y) {
for (int x = 0; x < width; ++x) {
// 计算当前像素的索引
int index = y * width + x;
// 将像素值从[0, 255]映射到[0, 1]
double pixelValue = static_cast<double>(image[index]) / 255.0;
// 应用伽马变换
double correctedValue = pow(pixelValue, gamma);
// 确保值不会超出[0, 1]范围(尽管在伽马校正中通常不会)
correctedValue = std::min(std::max(correctedValue, 0.0), 1.0);
// 将值重新映射回[0, 255]并转换为unsigned char
image[index] = static_cast<unsigned char>(correctedValue * 255.0);
}
}
}
图像数据伽马变换算法
最新推荐文章于 2024-11-12 12:29:51 发布