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;
}
代码说明:
-
adjustBrightness()
函数:遍历图像的每个像素,对每个RGB通道的值加上brightness
参数的值。使用saturate_cast<uchar>
来确保像素值在0到255之间,防止溢出或下溢。 -
主程序:读取输入图像,调用
adjustBrightness()
函数来调整图像的亮度,并显示原始图像和处理后的图像。
结果:
brightness
为正值时,图像整体会变得更亮。brightness
为负值时,图像整体会变得更暗。
这种方法非常直观,但也存在局限性,例如如果过度提高亮度,可能会导致图像细节丢失或过度曝光。因此,实际应用中通常需要结合其他图像处理技术来改善效果。