Skip to content

Instantly share code, notes, and snippets.

@pengdu
Created April 25, 2023 09:27
Show Gist options
  • Save pengdu/c0d19b53b4894335473378eef43d05d5 to your computer and use it in GitHub Desktop.
Save pengdu/c0d19b53b4894335473378eef43d05d5 to your computer and use it in GitHub Desktop.
以下是一种较为复杂的自动白平衡算法,称为“灰度世界假设”(Gray World Assumption):
1. 将图像转换为LAB颜色空间。
2. 对于每个像素,计算其在LAB颜色空间中的L, a, b值。
3. 计算图像的平均L, a, b值。
4. 将平均值的a, b值分别设置为0,保持平均值的L值不变。
5. 对于每个像素,计算其在LAB颜色空间中的L, a, b值与平均值的L, a, b值的差值,分别得到∆L, ∆a, ∆b。
6. 计算所有像素的∆a, ∆b的平均值,得到∆a_avg, ∆b_avg。
7. 将平均值的a, b值分别加上∆a_avg, ∆b_avg,得到目标a, b值。
8. 将目标L, a, b值转换为RGB颜色空间,得到白平衡后的图像。
该算法的基本思想是假设图像的平均颜色是灰色的,因此在LAB颜色空间中,图像的平均a, b值应该为0。然后计算每个像素的颜色偏移量,并将平均偏移量应用于整个图像,以实现白平衡。
以下是一个实现该算法的C++代码:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
// 读取图像
Mat image = imread("test.jpg", IMREAD_COLOR);
// 将图像转换为 LAB 颜色空间
Mat lab_image;
cvtColor(image, lab_image, COLOR_BGR2Lab);
// 分离 L, a, b 通道
vector<Mat> lab_planes;
split(lab_image, lab_planes);
// 计算 L, a, b 通道的平均值
Scalar avg_lab = mean(lab_image);
// 将 a, b 通道的平均值设置为 0
avg_lab.val[1] = 0;
avg_lab.val[2] = 0;
// 计算每个像素的颜色偏移量
Mat delta_a = lab_planes[1] - avg_lab.val[1];
Mat delta_b = lab_planes[2] - avg_lab.val[2];
// 计算颜色偏移量的平均值
Scalar avg_delta_a = mean(delta_a);
Scalar avg_delta_b = mean(delta_b);
// 计算目标 a, b 值
double target_a = avg_lab.val[1] + avg_delta_a.val[0];
double target_b = avg_lab.val[2] + avg_delta_b.val[0];
// 将 L, a, b 通道合并
Mat new_lab_image;
merge(vector<Mat>{lab_planes[0], Mat::ones(lab_planes[1].size(), CV_8UC1) * target_a, Mat::ones(lab_planes[2].size(), CV_8UC1) * target_b}, new_lab_image);
// 将图像转换回 BGR 颜色空间
Mat new_image;
cvtColor(new_lab_image, new_image, COLOR_Lab2BGR);
// 显示结果
namedWindow("Original Image", WINDOW_NORMAL);
namedWindow("Automatic White Balance", WINDOW_NORMAL);
imshow("Original Image", image);
imshow("Automatic White Balance", new_image);
waitKey(0);
return 0;
}
```
该代码使用OpenCV库实现自动白平衡。它将图像转换为LAB颜色空间,计算平均L, a, b值,并将平均a, b值分别设置为0。然后计算每个像素的颜色偏移量,并计算偏移量的平均值。最后将平均偏移量应用于整个图像,将图像转换回BGR颜色空间,并显示结果。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment