Боюсь, что происходит какое-то несоответствие типов. (Я не проверял, но мне было бы интересно, если он даже компилируется.)
QImage::pixel()
возврат QRgb
.
qRed()
принимает QRgb
и возвращает int
.
Следовательно, мне интересно, что бы сделал val=qRed(val);
. (Если он компилируется, он, вероятно, не делает ожидаемого.)
Имея это в виду, я немного изменил код OP:
QImage Filters::aply_filtre_gamma(QImage image)
{
for(int x = 0; x < image.width(); ++x)
for(int y = 0 ; y < image.height(); ++y) {
const QRgb rgb = image.pixel(x, y);
const double r = qRed(rgb) / 255.0;
const double g = qGreen(rgb) / 255.0;
const double b = qBlue(rgb) / 255.0;
image.setPixelColor(x, y,
QColor(
255 * std::pow(r, 2.2),
255 * std::pow(g, 2.2),
255 * std::pow(b, 2.2)));
}
return image;
}
Раньше я делал небольшое обновление в Википедии относительно гамма-коррекции .
Примечание:
Я также исправил начальные значения циклов for
. Пиксель верхнего левого угла имеет координаты (0, 0) & ndash; но не (1, 1).
Полный тест / пример & ndash; testQImageGamma.cc
#include <QtWidgets>
QPixmap fromImage(const QImage &qImg)
{
QPixmap qPixmap;
qPixmap.convertFromImage(qImg);
return qPixmap;
}
QImage gamma(const QImage &qImg, double exp)
{
QImage qImgRet(qImg);
for (int x = 0; x < qImg.width(); ++x) {
for (int y = 0 ; y < qImg.height(); ++y) {
const QRgb rgb = qImg.pixel(x, y);
const double r = qRed(rgb) / 255.0;
const double g = qGreen(rgb) / 255.0;
const double b = qBlue(rgb) / 255.0;
qImgRet.setPixelColor(x, y,
QColor(
255 * std::pow(r, exp),
255 * std::pow(g, exp),
255 * std::pow(b, exp)));
}
}
return qImgRet;
}
int main(int argc, char **argv)
{
qDebug() << "Qt Version:" << QT_VERSION_STR;
QApplication app(argc, argv);
// setup data
const QImage qImg("cat.rgb.png");
const QImage qImgGamma = gamma(qImg, 1 / 2.2);
// setup UI
QWidget qWin;
qWin.setWindowTitle(QString::fromUtf8("Gamma Correction"));
QVBoxLayout qVBox;
QLabel qLbl(QString::fromUtf8("Original Image:"));
qVBox.addWidget(&qLbl);
QLabel qLblImg;
qLblImg.setPixmap(fromImage(qImg));
qVBox.addWidget(&qLblImg);
qWin.setLayout(&qVBox);
QLabel qLblGamma(QString::fromUtf8("Gamma corrected Image:"));
qVBox.addWidget(&qLblGamma);
QLabel qLblImgGamma;
qLblImgGamma.setPixmap(fromImage(qImgGamma));
qVBox.addWidget(&qLblImgGamma);
qWin.setLayout(&qVBox);
qWin.show();
// runtime loop
return app.exec();
}
Файл проекта Qt testQImageGamma.pro
:
SOURCES = testQImageGamma.cc
QT += widgets
Скомпилировано и протестировано на cygwin64 на Windows 10:
$ qmake-qt5 testQImageGamma.pro
$ make && ./testQImageGamma
Qt Version: 5.9.4
Обратите внимание, что я использовал 1 / 2.2
в качестве показателя в моем примере. (В версии 2.2 изображение с гамма-коррекцией стало темнее.)