gpt4 book ai didi

c++ - qt中的图像 Gamma 校正

转载 作者:搜寻专家 更新时间:2023-10-31 02:04:41 33 4
gpt4 key购买 nike

我尝试使用 qt 更改图像的 Gamma,但没有得到理想的结果。这是我的代码:

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 ;
}

我的代码有错误还是我没有正确使用公式?

最佳答案

恐怕会发生一些类型不匹配的情况。 (我没有检查,但我想知道它是否可以编译。)

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;
}

之前,我在维基百科上做了一个关于gamma correction的简短刷新。 .

注意:

我还修复了 for 循环的起始值。左上角的像素坐标为 (0, 0),但没有坐标 (1, 1)。


一个完整的测试/例子——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 中,经过 Gamma 校正的图像变得更暗。)

关于c++ - qt中的图像 Gamma 校正,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53153300/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com