图像亮度调节--幂次变换

幂次变换的基本表达式为:y=cxr+b

    其中cr均为正数。与对数变换相同,幂次变换将部分灰度区域映射到更宽的区域中。当r=1时,幂次变换转变为线性变换。

   (1)  当0<r<1时,变换函数曲线在正比函数上方。此时扩展低灰度级,压缩高灰度级,使图像变亮。这一点与对数变换十分相似。

   (2)  当r>1时,变换函数曲线在正比函数下方。此时扩展高灰度级,压缩低灰度级,使图像变暗。

   代码如下:

int PowerTrans(Mat & pSrc,double r,double b=0, double c=1) 
{ 
    //y=cxr+b
    // 映射表,用于256种灰度变换后的值 
    BYTE map[256]; 

    // 保存运算后的临时值 
    double dTemp;
    for (int i = 0; i < 256; i++) 
    { 
        // 计算当前像素变换后的值 
        dTemp = c * pow(i / 255.0, r) * 255 + b; 

        // 如果超界则修改其值 
        if (dTemp < 0) 
            dTemp = 0.0; 
        else if (dTemp > 255) 
            dTemp = 255; 

        // 四舍五入 
        map[i] = int(dTemp + 0.5); 
    } 

    int columns=pSrc.cols;  
    int channels = pSrc.channels();
    int count = 0;
    for(int i=0;i<pSrc.rows;i++)  
    {  
        uchar* p=pSrc.ptr(i);//获取Mat某一行的首地址  
        for(int j=0;j<columns*channels;j++)  
        {
            *(p+j) = map[*(p+j)]; 
        }
    } 
    return 0; 
} 

 

posted on 2017-07-20 16:14  zyz913614263  阅读(1589)  评论(0编辑  收藏  举报

导航