Gamma变换: y=x^gamma;
gamma>1, 较亮的区域灰度被拉伸,较暗的区域灰度被压缩的更暗,图像整体变暗;
gamma>1, 较亮的区域灰度被拉伸,较暗的区域灰度被压缩的更暗,图像整体变暗;
gamma<1, 较亮的区域灰度被压缩,较暗的区域灰度被拉伸的较亮,图像整体变亮;
#include<iostream>
#include<highgui\highgui.hpp>
#include<core/core.hpp>
#include<math.h>
using namespace cv;
using namespace std;
// get Gamma transformation look up table
void GetGammaTransLUT(uchar *pLUT, float Gamma, int iLUTLen)
{
for(int i=0;i<iLUTLen;i++)
{
pLUT[i]=(uchar)(pow((float)i/255,Gamma)*255);
}
}
void GammaTrans(uchar *pSrc, uchar *pDst, const int iHeight,
const int iWidth, float Gamma)
{
uchar *pLUT=new uchar[256];
GetGammaTransLUT(pLUT,Gamma,256);
for(int i=0;i<iHeight*iWidth;i++)
{
pDst[i]=(uchar)pLUT[pSrc[i]];
}
delete []pLUT;
}
int main()
{
Mat image=imread("Test.png",0);
Mat image_Dst(image.size(),image.type());
const int iHeight=image.rows;
const int iWidth=image.cols;
uchar* pSrc=image.data;//new uchar[iHeight*iWidth];
uchar* pDst=image_Dst.data;//new uchar[iHeight*iWidth];
GammaTrans(pSrc,pDst,iHeight,iWidth,2.7);
//namedWindow("Origin",1);
imshow("Origin",image);
//创建一个名字为“Lena”的图像显示窗口,(不提前声明也可以)
//namedWindow("Gamma Trans",1);
//显示图像
imshow("Gamma Trans",image_Dst);
//等待按键
waitKey();
return 0;
}