【问题标题】:How to change the brightness for all three channels of the image?如何更改图像所有三个通道的亮度?
【发布时间】:2021-07-04 19:41:03
【问题描述】:

我试图通过将图像从 BGR 转换为 LAB 并将 L 参数更改为 L+brightness 来更改图像的亮度。它可以改变亮度但输出图像是蓝色的,为什么?

void MainWindow::BrightnessSlider(cv::Mat image)
{


    cv::Mat image2;
    cv::cvtColor(image,image2,cv::COLOR_BGR2Lab);

    for (int i=0; i < image2.rows; i++)
   {
        for (int j=0; j < image2.cols; j++)

        {
            image2.at<cv::Vec3b>(i,j)[0] = cv::saturate_cast<uchar>(image2.at<cv::Vec3b>(i,j)[0] + brightness);
             
        }
    }
    cv::cvtColor(image2,image2,cv::COLOR_Lab2BGR);
    QImage imageupdate= QImage((const unsigned char*)(image2.data), image2.cols,image2.rows,QImage::Format_RGB888);

    int w = ui->label->width();
    int h =ui-> label->height();
   ui->label->setPixmap(QPixmap::fromImage(imageupdate.scaled(w,h,Qt::KeepAspectRatio)));


}

【问题讨论】:

  • 代码里面的亮度值是多少? image2 刚把lab转成bgr后的样子?

标签: c++ qt opencv


【解决方案1】:

这里的主要问题是 OpenCV 中的 3 通道彩色图像使用 BGR 内存布局,而在 Qt 中它们使用 RGB 内存布局。这就是您在 QLabel 中显示的图像看起来“蓝色”的原因。

要解决内存布局问题,您应该在第二个cv::cvtColor() 中将cv::COLOR_Lab2BGR 更改为cv::COLOR_Lab2RGB

cv::cvtColor(image2, image2, cv::COLOR_Lab2RGB);

.rgbSwapped()追加到imageupdate(注意imageupdate不会与image2共享内存块):

QImage imageupdate = QImage((const unsigned char*)(image2.data),
     image2.cols, image2.rows, QImage::Format_RGB888).rgbSwapped();

顺便说一句,您可以使用Mat::operator+(const Scalar&amp;) 更改所有像素的值,不需要颜色转换和for循环:

cv::Mat image2 = image + cv::Scalar::all(brightness);
// convert BGR to RGB if you don't want to allocate additional memory
// for imageupdate with QImage::rgbSwapped():
cv::cvtColor(image2, image2, cv::COLOR_BGR2RGB);

【讨论】:

    猜你喜欢
    • 2012-10-10
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2018-09-26
    相关资源
    最近更新 更多