OpenCV(图像明度)



1. 图像明度(Brightness)

明度(Brightness)是图像中反映光亮程度的一个属性,通常用于描述像素的亮度水平。

对于RGB图像,明度(Luminance)每个像素中红、绿、蓝通道的加权和。

\[\text{Luminance} = 0.299 \times R + 0.587 \times G + 0.114 \times B \]

这个公式是基于人眼对不同颜色的敏感度,绿光对明度的贡献最大,红光次之,蓝光最小。



2. 明度调整的原理

调整明度的基本原理是对每个像素的RGB值进行加减操作,使像素的整体亮度提高或降低。

\[R' = \text{Clamp}(R + \Delta) \\ G' = \text{Clamp}(G + \Delta) \\ B' = \text{Clamp}(B + \Delta) \]

其中 \(\Delta\) 是明度调整的量,\(Clamp()\) 函数用于确保值在0到255的范围内。



3. 示例

用于调整RGB图像的明度。

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

// 调整明度的函数
void adjustBrightness(const Mat& src, Mat& dst, int brightness) {
    // 创建输出图像,并初始化为与原图像相同的尺寸和类型
    dst = Mat::zeros(src.size(), src.type());
    
    // 遍历每个像素并调整明度
    for (int y = 0; y < src.rows; y++) {
        for (int x = 0; x < src.cols; x++) {
            for (int c = 0; c < src.channels(); c++) {
                // 调整RGB通道中的每个像素值,并确保结果在[0, 255]范围内
                dst.at<Vec3b>(y, x)[c] = saturate_cast<uchar>(src.at<Vec3b>(y, x)[c] + brightness);
            }
        }
    }
}

int main(int argc, char** argv) {
    // 读取输入图像
    Mat src = imread("input_image.jpg");
    if (src.empty()) {
        cout << "无法打开图像文件" << endl;
        return -1;
    }

    // 定义输出图像
    Mat dst;

    // 明度调整值,可以是正数或负数
    int brightness = 50; // 增加50单位的亮度

    // 调用调整明度的函数
    adjustBrightness(src, dst, brightness);

    // 显示原图和调整后的图像
    imshow("Original Image", src);
    imshow("Brightness Adjusted Image", dst);

    // 保存调整后的图像
    imwrite("output_image.jpg", dst);

    // 等待按键
    waitKey(0);

    return 0;
}

代码说明:

  1. adjustBrightness() 函数:遍历图像的每个像素,对每个RGB通道的值加上 brightness 参数的值。使用 saturate_cast<uchar> 来确保像素值在0到255之间,防止溢出或下溢。

  2. 主程序:读取输入图像,调用 adjustBrightness() 函数来调整图像的亮度,并显示原始图像和处理后的图像。

结果:

  • brightness 为正值时,图像整体会变得更亮。
  • brightness 为负值时,图像整体会变得更暗。

这种方法非常直观,但也存在局限性,例如如果过度提高亮度,可能会导致图像细节丢失或过度曝光。因此,实际应用中通常需要结合其他图像处理技术来改善效果。



posted @ 2024-09-22 21:58  做梦当财神  阅读(45)  评论(0编辑  收藏  举报