图像数据伽马变换算法

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);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值