Гамма-коррекция изображения в QT - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь изменить гамму изображения, используя qt, но не получаю желаемого результата. Вот мой код:

QImage Filters::aply_filtre_gamma(QImage image){
   // (std::pow((image.pixel(x,y)/255),2.2))*255
    QRgb val;

    for(int x=1; x < image.width(); x++)
        for(int y=1 ; y < image.height(); y++){
           val=image.pixel(x,y);
           val=qRed(val);

           val=std::pow(val/255,2)*255;
           //std::cout<<"valoare pixel:"<<valll<<std::endl;
           image.setPixel(x,y, QColor(val, val, val).rgb());
          // image.setPixel(x,y,std::pow((valll/65025),2.2)*65025);

        }

return image ;
}

В моем коде ошибка или я не правильно использую формулу?

1 Ответ

0 голосов
/ 05 ноября 2018

Боюсь, что происходит какое-то несоответствие типов. (Я не проверял, но мне было бы интересно, если он даже компилируется.)

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

Snapshot of testQImageGamma

Обратите внимание, что я использовал 1 / 2.2 в качестве показателя в моем примере. (В версии 2.2 изображение с гамма-коррекцией стало темнее.)

...