PDA

View Full Version : Image contrast



toutarrive
3rd November 2009, 18:10
Hello,

i must implement a brightness/contrast filter.

So far I've managed to brighten an image as follows :




QImage ConvolutionFilter:: brighten(QImage& source, int factor)
{
if (factor < -255 || factor > 255) return source;
int red, green, blue;

/* for ( int y=0; y<source.height(); y++ ) {
uchar *p = source.scanLine(y);
for (int x = 0; x < source.width(); x ++) {
red = int((*p++) + factor);
red = (red < 0x00) ? 0x00 : (red > 0xff) ? 0xff : red;
green = int((*p++)+ factor);
green = (green < 0x00) ? 0x00 : (green > 0xff) ? 0xff : green;
blue = int((*p++) + factor);
blue = (blue < 0x00) ? 0x00 : (blue > 0xff) ? 0xff : blue ;
int alpha = int(*p++);
QRgb rgbaValue = qRgba(red,green,blue, alpha);
source.setPixel(x,y, rgbaValue);
}
}*/

int pixels = source.width() * source.height();
unsigned int *data = (unsigned int *)source.bits();
for (int i = 0; i < pixels; ++i) {
red= qRed(data[i])+ factor;
red = (red < 0x00) ? 0x00 : (red > 0xff) ? 0xff : red;
green= qGreen(data[i])+factor;
green = (green < 0x00) ? 0x00 : (green > 0xff) ? 0xff : green;
blue= qBlue(data[i])+factor;
blue = (blue < 0x00) ? 0x00 : (blue > 0xff) ? 0xff : blue ;
data[i] = qRgba(red, green, blue, qAlpha(data[i]));
}
return source;
}


But I'm totally stuck with contrast.

I would deeply appreciate if someone could give me some hints how to handle this task.

Regards.

toutarrive
4th November 2009, 13:54
for those interested i came up with this code, the contrast can be applied recursively :



QImage ConvolutionFilter::contrast(QImage& source, int factor)
{
//contrast :new color = 128 + Contrast *( old color - 128)
if (factor < 0) return source;
if (factor > 20) return source;
double contrast = (100.0+factor)/100.0;
double red, green, blue;
int pixels = source.width() * source.height();
unsigned int *data = (unsigned int *)source.bits();
for (int i = 0; i < pixels; ++i) {
red= 128+ contrast*(qRed(data[i])-128);
red = (red < 0x00) ? 0x00 : (red > 0xff) ? 0xff : red;
green= 128+ contrast*(qGreen(data[i])-128);
green = (green < 0x00) ? 0x00 : (green > 0xff) ? 0xff : green;
blue= 128+ contrast*(qBlue(data[i])-128);
blue = (blue < 0x00) ? 0x00 : (blue > 0xff) ? 0xff : blue ;
data[i] = qRgba(red, green, blue, qAlpha(data[i]));
}
return source;
}




Comments and improvements are welcome ...