伽马变换:在图像处理中,将漂白(相机过曝)的图片或者过暗(曝光不足)的图片,进行修正!
伽马变换的基本形式如下:
曲线图如下:
通过以上曲线图:
gamma值小于1时,会拉伸图像中灰度级较低的区域,同时会压缩灰度级较高的部分
gamma值大于1时,会拉伸图像中灰度级较高的区域,同时会压缩灰度级较低的部分
以下是我测试的效果图:
gamma值设置为2.7,提高了对比度
gamma值设置为0.7,效果如下:
gamma值设置为0.6,效果如下:
gamma值设置为0.4,效果如下:
以下是我测试的代码:
voidCreatTable_Gamma(uchartable[],floatnPercent) { floatval; for(inti=0;i<256;i++) { val=pow( (float)i/255.0f, nPercent)*255.0f; if(val>255) val=255; if(val<0) val=0; table[i]=(uchar)val; } }
voidImageAdjust(IplImage*src,uchartable[]) {
intstep = src->widthStep; //相邻行的同列点之间的字节数 intchannels = src->nChannels; //颜色通道数目(1,2,3,4) uchar*data = (uchar*)src->imageData; //intensity transform intx,y; int val; for(y = 0; y < src->height;y++) { for(x = 0; x < src->width;x++) { for(intk=0;k != channels; ++ k) { val= data[y*step+x*channels+k]; data[y*step+x*channels+k]= table[val]; } } } }
intmain() { char*filename="D:\\gamma\\2.jpg"; IplImage*dst,*src = cvLoadImage(filename); if(!src) { printf("Couldn'tseem to Open %s, sorry/n",filename); return-1; }
cvNamedWindow("src"); cvNamedWindow("result");
dst= cvCloneImage(src);
uchartable[256]; CreatTable_Gamma(table,2.7 ); ImageAdjust(src,table);
cvShowImage("src",dst); cvShowImage("result",src);
cvWaitKey(0); cvDestroyWindow("src"); cvDestroyWindow("result"); cvReleaseImage(&src ); cvReleaseImage(&dst ); return0; } |