[ad#AdBrite inline]
// CHANGES BRIGHTNESS AND/OR CONTRAST
// INPUT: IplImage * (nChannels=1 OR nChannels=3; IPL_DEPTH_8U)
// RETURNS: IplImage * SAME DEPTH AND CHANNELS AS INPUT
IplImage * ContrastBrightness(IplImage *src, int Contrast, int Brightness)
{
if(Contrast > 100) Contrast = 100;
if(Contrast < -100) Contrast = -100;
if(Brightness > 100) Brightness = 100;
if(Brightness < -100) Brightness = -100;
uchar lut[256];
CvMat* lut_mat;
int hist_size = 256;
float range_0[]={0,256};
float* ranges[] = { range_0 };
int i;
IplImage * dest = cvCloneImage(src);
IplImage * GRAY = cvCreateImage(cvGetSize(src),src->depth,1);
if (src->nChannels ==3)
{
cvCvtColor(src,GRAY,CV_RGB2GRAY);
}
else
{
cvCopyImage(src,GRAY);
}
lut_mat = cvCreateMatHeader( 1, 256, CV_8UC1 );
cvSetData( lut_mat, lut, 0 );
/*
* The algorithm is by Werner D. Streidt
* (http://visca.com/ffactory/archives/5-99/msg00021.html)
*/
if( Contrast > 0 )
{
double delta = 127.* Contrast/100;
double a = 255./(255. - delta*2);
double b = a*(Brightness - delta);
for( i = 0; i < 256; i++ )
{
int v = cvRound(a*i + b);
if( v < 0 )
v = 0;
if( v > 255 )
v = 255;
lut[i] = v;
}
}
else
{
double delta = -128.* Contrast/100;
double a = (256.-delta*2)/255.;
double b = a* Brightness + delta;
for( i = 0; i < 256; i++ )
{
int v = cvRound(a*i + b);
if( v < 0 )
v = 0;
if( v > 255 )
v = 255;
lut[i] = v;
}
}
if (src->nChannels ==3)
{
IplImage * R = cvCreateImage(cvGetSize(src),src->depth,1);
IplImage * G = cvCreateImage(cvGetSize(src),src->depth,1);
IplImage * B = cvCreateImage(cvGetSize(src),src->depth,1);
cvCvtPixToPlane(src,R,G,B,NULL);
// PERFORM IT ON EVERY CHANNEL
cvLUT( R, R, lut_mat );
cvLUT( G, G, lut_mat );
cvLUT( B, B, lut_mat );
cvCvtPlaneToPix(R,G,B,NULL,dest);
cvReleaseImage(&R);
cvReleaseImage(&G);
cvReleaseImage(&B);
}
else
{
//PERFORM IT ON THE CHANNEL
cvLUT( GRAY, dest, lut_mat );
}
cvReleaseImage(&GRAY);
cvReleaseMat( &lut_mat);
return dest;
}
[ad#AdBrite inline]