Gamma变换: y=x^gamma;
gamma>1, 较亮的区域灰度被拉伸,较暗的区域灰度被压缩的更暗,图像整体变暗;
gamma<1, 较亮的区域灰度被压缩,较暗的区域灰度被拉伸的较亮,图像整体变亮;
参考:
http://blog.csdn.net/lxy201700/article/details/24929013
#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.0,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("C:\\迅雷下载\\图像处理\\Projects\\MyOpenCV\\MyOpenCV\\DIP3ECH06\\Fig0638(a)(lenna_RGB).tif",0);
Mat image_Dst=imread("C:\\迅雷下载\\图像处理\\Projects\\MyOpenCV\\MyOpenCV\\DIP3ECH06\\Fig0648(b)(lenna-noise-G-gauss-mean0-var800).tif",0);
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);
//namedWindow("Origin",1);
imshow("Origin",image);
//创建一个名字为“Lena”的图像显示窗口,(不提前声明也可以)
//namedWindow("Gamma Trans",1);
//显示图像
imshow("Gamma Trans",image_Dst);
//等待按键
waitKey();
return 0;
}