C++ 如何更改图像所有三个通道的亮度?

C++ 如何更改图像所有三个通道的亮度?,c++,qt,opencv,C++,Qt,Opencv,我试图通过将图像从BGR转换为LAB并将L参数更改为L+亮度来更改图像的亮度。它可以改变亮度,但输出图像是蓝色的,为什么 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

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

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


}

这里的主要问题是OpenCV中的3通道彩色图像使用BGR内存布局,而Qt中的3通道彩色图像使用RGB内存布局。这就是为什么QLabel中显示的图像看起来是蓝色的

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

cv::cvtColorimage2,image2,cv::COLOR_Lab2RGB; 或将.rgbSwapped附加到imageupdate注意,imageupdate不会与image2共享内存块:

QImage imageupdate=QImageconst unsigned char*image2.data, image2.cols,image2.rows,QImage::Format_RGB888.rgbSwapped; 顺便说一句,您可以使用Mat::operator+const Scalar&更改所有像素的值,不需要颜色转换和for循环:

cv::Mat image2=图像+cv::标量::所有亮度; //如果不想分配额外内存,请将BGR转换为RGB //对于使用QImage::rgbSwapped的imageupdate: cv::cvtColorimage2,image2,cv::COLOR_BGR2RGB;
代码中的亮度值是多少?刚将实验室转换为bgr后,image2的外观如何?谢谢,它现在可以工作了。