- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我尝试使用 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
请注意,我在示例中使用了 1/2.2
作为指数。 (在 2.2 中,经过 Gamma 校正的图像变得更暗。)
关于c++ - qt中的图像 Gamma 校正,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53153300/
我试图通过叠加更新的(更详细的)卫星图像(我从 {leaflet} 包中获取)来改善 Rayshader 的外观,但叠加层不匹配与 3D 渲染。 理想情况下,我正在寻找可以获取全局卫星图像的开源解决方
我想构建一个由单个数字组成的常量数组(1..200)来制作一个“查找表”,以将值为 1 - 200 的滚动条的位置转换为用于对图像应用 Gamma 校正的值。 第一个数组值的值在 7.0 - 9.9
我尝试对图像进行一些简单的 Gamma 校正。起初,我尝试使用 Matlab,然后将其应用于 opencv。但我得到不同的结果。下面是部分代码。代码哪里出错了? 在matlab中: for i=1:r
我使用 DirectXTex 库捕获 DX11 游戏的屏幕截图并将其保存到文件中。问题是当我将它保存为 jpeg 时效果很好,但如果我将它保存为 png 图像会变得非常明亮并被洗掉。我使用 Tweak
我正在尝试使用以下代码检测图像中ID卡的边界。关键是我使用的 Gamma 值。我使用2或3的值(假设我希望卡在背景下突出显示)。使用背景较浅或与卡片颜色本身一样浅的照片时遇到问题。请看下面的图片..第
我正在进行立体视觉设置,机翼上方安装了 2 个摄像头。左摄像头向内倾斜几度,而右摄像头与机翼平行。所有可用图像 here 然后使用(剪切和粘贴,但不按原样编译) // performing stere
我正在尝试解决有关 NFA 的问题。指令如下:字母{a, b, c}。 • L1 是最后一个字符与倒数第五个字符相同的所有字符串。例如,应该接受字符串 aaacbacbca,因为倒数第五个字符和最后一
我尝试使用 qt 更改图像的 Gamma,但没有得到理想的结果。这是我的代码: QImage Filters::aply_filtre_gamma(QImage image){ // (std:
我需要对 Y'CbCr 空间中的图像进行 Gamma 校正,以便在图像中的饱和和饥饿区域中显示细节,我想知道是否需要调整色度子 channel ? 我知道如果我让亮度 channel 像素挨饿,如果我
我不了解opencv中hog.cpp中的 Gamma 校正代码,我经历了一些链接here与opencv hog.cpp中的代码不匹配 Mat_ _lut(1, 256); const float* l
根据本页http://www.w3schools.com/cssref/css3_pr_filter.asp有对比度、亮度、色调、饱和度等。但没有明确访问 Gamma 。有没有办法用现有的 CSS3
我进行了超几何分析(使用 Python 脚本)来研究 GO-terms 在基因子集中的富集。我的输出示例如下: GO00001 1500 300 200 150 5.39198144708e-7
我使用 Opencv 编写了一个 Android 应用程序,我的图像处理算法需要对检测到的矩形进行正确的旋转,因此作为该过程的开始,我 将最大的矩形检测为 RotatedRect。 获取矩形的旋转角度
我正在使用 OpenCV 校准和校正立体声系统。我有一个眼睛会聚的立体相机,实际上我按以下顺序运行这些功能: for(int j=0; j < ChessBoard.numSquares; j++)
我会对图像使用 Gamma 校正。因此,我必须使用 G = 0.6 为源图像的每个像素强度赋值。我有问题,因为目标图像完全错误。当我从源图像中获取像素时,可能会遇到转换问题。这是我的代码: #incl
我正在构建一个 Android 应用程序,为用户提供一些图像处理功能。但在应用任何图像转换功能之前,我想进行 Gamma 校正以改善图像。我知道如何执行 Gamma 校正,但我不知道要使用什么 Gam
我在 Windows 10 上使用 SDL2 创建 OpenGL 上下文,但是当我尝试在 Intel UHD 630 上获取帧缓冲区附件颜色编码时,我收到了无效操作错误。在我的 Nvidia Gefo
我有RGB数据和Gamma校正比例 我可以用下面的来计算吗 R = pow(R, 1/Gamma) G = pow(G, 1/Gamma) B = pow(B, 1/Gamma) 或 Gamma 校正
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
自 Snow Leopard 以来,QTKit 现在从 QTMovies frameImageAtTime:withAttributes:error: 等函数返回颜色校正后的图像数据。给定未压缩的 A
我是一名优秀的程序员,十分优秀!