【问题标题】:change image brightness with c++用 C++ 改变图像亮度
【发布时间】:2021-11-09 21:05:24
【问题描述】:

我想改变图像的亮度,只访问像素值。 不使用opencv函数(例如convertTo)

输入:图像,数字

num 表示亮度的恒定值

这是我的代码,结果看起来很奇怪。 有什么问题吗?

original

result

cv::Mat function(cv::Mat img, int num){
    cv::Mat output;
    output = cv::Mat::zeros(img.rows, img.cols, img.type());
    for (int i = 0; i < img.rows; i++)
    {
        for (int j = 0; j < img.cols; j++)
        {
            for (int c = 0; c < img.channels(); c++)
            {
                output.at<cv::Vec3b>(i, j)[c] = img.at<cv::Vec3b>(i, j)[c] + num;
            
                if (output.at<cv::Vec3b>(i, j)[c] > 255){
                    output.at<cv::Vec3b>(i, j)[c] = 255;
                }
                else if (output.at<cv::Vec3b>(i, j)[c] < 0)
                {
                    output.at<cv::Vec3b>(i, j)[c] = 0;
                }

            }
        
        }

    }
    cv::imshow("output", output);
    cv::waitKey(0);
    return img;
}

【问题讨论】:

  • 您可能会遇到溢出环绕。在分配给输出之前检查溢出。 if(255- img.at...[c]) &gt; num...
  • 我有一个将图像的 RGB 字节转换为 YUV、缩放 Y(以获得更多亮度)以及保存回 RGB 和原始文件格式的演示。它适用于 GDI+ 而不是 OpenCV,但您可能可以使用相同的技术。完整代码是here 原来关于SO 的讨论是here

标签: c++ opencv image-processing computer-vision brightness


【解决方案1】:

不使用opencv函数

这有点傻,因为您的代码已经在使用 opencv 的数据结构。

试图这样做,你也重新发明了轮子,尽管是一个稍微方形的轮子......

在分配给输出之前检查溢出。

是的,这就是问题所在。正确的做法是:将总和分配给大于的东西,然后然后检查

else if (output.at<cv::Vec3b>(i, j)[c] < 0)

这永远不会发生,试着理解为什么


但请注意,您的整个代码(三重循环,omg !!!)可以简单地重写:

Mat output = img + Scalar::all(num);

(更快、更安全,而且这也会正确饱和!)

【讨论】:

    猜你喜欢
    • 2018-09-25
    • 1970-01-01
    • 2014-02-17
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    相关资源
    最近更新 更多