2015-07-21 15:40:33 Bettyshasha 阅读数 9864

输入图像灰度值 r,输出图像灰度值s,变换公式 s = T(r),如下 :


原图像“arial.jpg“,取0.7,3.0,变换后图像如下,并附三通道分布直方图(B,G,R).


Arial                                                                 gamma 0.7                                                                                    

  

   gamma3.0

 

Histogram(channel B G R)                     0                                                                        1                                                                        2

Raw       

 

Gama0.7  

 

Gama3.0   

从图像可以看出,大于一时,对图像的灰度分布直方图具有拉伸作用(使灰度向高灰度值延展),而小于1时,对图像的灰度分布直方图具有收缩作用(是使灰度向低灰度值方向靠拢)。

<pre name="code" class="html">void  gamaCorrection(unsigned char *imageData,float gamma,float coef){
	for(int i =0;i<nlen;i++){
		imageData[i] = coef*pow(imageData[i],gamma);
	}
}

转载请注明出处:http://blog.csdn.net/bettyshasha/article/details/46987115
实验代码及图片资料下载:http://download.csdn.net/detail/bettyshasha/8920405



 


2016-12-10 11:00:19 rongfzh1990 阅读数 8377

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

这里写图片描述

2014-03-16 22:54:38 u012033076 阅读数 1738
	/// 伽马变换 公式:y = (x + esp)^gamma
	Mat Gamma_image;
	Gamma_image.create(512,512,CV_64FC1);//创建伽马图以保存结果像并初始化
	cvtColor(input_image, input_image, CV_BGR2GRAY);//输入图像(lena图)灰度化
	input_image.convertTo(input_image, CV_64FC1, 1, 0);//灰度图像将uchar变为double
	normalize(input_image, input_image, 0, 1, NORM_MINMAX, -1, Mat() );//灰度图归一到[0,1]
	float esp = 0.1;//定义补偿系数esp
	input_image = input_image + esp;//x + esp
	pow(input_image, 0.345, Gamma_image);//(x + esp)^gamma
	normalize(Gamma_image, Gamma_image, 0, 255, NORM_MINMAX, -1, Mat() );//Gamma图像归一到[0,255]
	Gamma_image.convertTo(Gamma_image, CV_8UC1, 1, 0);//Gamma图像转为8位单通道
	imshow("Gamma_image",Gamma_image);

将《数字图像处理与机器视觉》书中P76页中的伽马变换做了一下,理论部分在该书的P76-77.

《数字图像处理与机器视觉》 该书下载地址:http://pan.baidu.com/share/link?shareid=3551301329&uk=1610854122

gamma等于1就相当于之前灰度线性变换中Fa=1的情况,这种有侧重增强高、低灰度的方法还是要掌握的。

2017-09-21 11:23:25 fu18946764506 阅读数 1822
Gamma变换: y=x^gamma; 
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;  
}



2019-08-16 22:31:56 qq_42181309 阅读数 101

参考文献:数字图像处理(第三版)   美RafaelC.Gonzalez(拉斐尔C.冈萨雷斯)

什么是gamma变换呢?gamma变换其实就是一条数学公式

属于灰度处理的一种,r是输入的灰度值,c一般设置为1,幂r就是gamma的系数对应变换值如下:它更具gamma值的不同,来实现图像的对比度增强。

这里对于C++实现而言有意思的一点就是图像要归一化。归一化什么意思呢?就是每个像素值除以255,它的结果就一定是0到1之间,归一化的好处是,这点我也没明白,但0到1之间,可能数字那些没那么大吧。注意这里你需要进行强制类型转换。而且你要学会查找表的思想。查找表就是一个空间换时间的操作。如果gamma值定了,那么对于每个灰度值0到255它的对应的变换值就是确定的。那么你就不用每个像素都算一次,因为求幂操作非常的消耗运算时间,你只需要开辟一段内存空间,提前存好结果,然后遍历每一个像素查找值就行。

我使用了两个函数进行实现,对应代码如下:

void bmp::build_table(byte *lut,double gamma)
{
	double temp;
	for(int i=0;i<=255;++i)
	{
		temp=double(i)/255;
		temp=pow(temp,gamma);
		lut[i]=unsigned char(temp*255);
		//printf("%d  ", unsigned char(lut[i]));
	}
}
void bmp::produce_gamma_bmp_file(double gamma)
{
	string gamma_file_name;
	for(int i=0;i<file_name.length()-4;++i)
	{
		gamma_file_name+=file_name[i];
	}
	gamma_file_name+="_gamma.bmp";
	byte *lut=new byte[256];
	build_table(lut,gamma);
	for(int i=0;i<image_heigth;++i)
		for (int j = 0; j < image_width; ++j)
			for(int k=0;k<byte_count;++k)
			{
				//printf("%d_", pixel[i][j][k]);
				pixel[i][j][k]=lut[pixel[i][j][k]];
				//printf("%d  ", pixel[i][j][k]);
			}
	produce_bmp_file(pixel,image_width,image_heigth,byte_count,gamma_file_name);
	delete[]lut;
}

 

展示:

原图像

 当我把gamma值设置为0.4时

  你会发现黑色的值变白了,这说明什么呢,说明黑色的值变大了,即小的值变大了,小的值被放大了。

再来看一个实用的例子:

原图像

 设置为0.4后,产生的图像

 你发现图像暗的地方明显被放大了。证明对比度增强了。

Gamma变换

阅读数 1128

没有更多推荐了,返回首页