现在的位置: 首页 > 综合 > 正文

opencv 图像伽马校正

2014年01月22日 ⁄ 综合 ⁄ 共 984字 ⁄ 字号 评论关闭

伽马校正,最好的,最高效的方法是通过table来访问:

核心函数LUT(The Core Function)

这是最被推荐的用于实现批量图像元素查找和更该操作图像方法。在图像处理中,对于一个给定的值,将其替换成其他的值是一个很常见的操作,OpenCV 提供里一个函数直接实现该操作,并不需要你自己扫描图像,就是:operationsOnArrays:LUT() <lut> ,一个包含于core module的函数. 首先我们建立一个mat型用于查表:

    Mat lookUpTable(1, 256, CV_8U);
    uchar* p = lookUpTable.data; 
    for( int i = 0; i < 256; ++i)
        p[i] = table[i];

然后我们调用函数 (I 是输入 J 是输出):

        LUT(I, lookUpTable, J);

好了该我上代码了:

int main()  
{  
   IplImage* src = cvLoadImage("e:\\kankan\\fish.jpg", 0 );
IplImage* dst = cvCreateImage(cvGetSize(src), 8, 1);
   uchar table[256];

    CreatTable_Gamma( table, 0.5 );
    LUT_Adj(src,dst,table);

		 	 }

void CreatTable_Gamma(uchar table[], float nPercent )
{
	float val;
	for(int i=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;
	}
}

创建table:

void CreatTable_Gamma(uchar table[], float nPercent )
{
	float val;
	for(int i=0;i<256;i++)
	{
		val= pow( (float)i/255.0f , nPercent)*255.0f;  
	    table[i]=(uchar)val;
	}
}

读table :

void LUT_Adj(const IplImage* src,IplImage* dst, uchar table[])
{
	dptr[x] = table[sptr[x]];      

			
}

但是现在c++版的table 方法更高效的。我这个有点旧啦。。。

附上效果图:

抱歉!评论已关闭.