作者:翟天保Steven 版权声明:作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明来源
实现原理
白平衡的意义在于通过加强相应的补色来补偿在特定光源下拍摄时的偏色,使白色物体还原为白色。
灰度世界算法是各种白平衡算法中最基本的算法之一。假设图像世界色彩丰富,红、蓝、绿三通道的灰度值在平均水平后接近一致,为灰色;如果每个通道的平均水平偏离灰色,则进行补偿,使其回到灰色,从而达到白平衡的效果。
一般来说,如果图像中的绿色强,蓝色和红色弱,使用灰度世界算法后,绿色会适当减弱,蓝色和红色会适当增强,从而缓解原有严重的颜色偏差。
实现灰度世界算法的过程如下:
1.计算图像RGB三通道各自的平均灰度值Raver、Gaver、Baver。
2.计算灰色:Gray=(Raver Gaver Baver)/3。
3.计算三通道的补偿系数,即灰色值除以单通道的平均值。
功能函数代码
// 白平衡-灰度世界 cv::Mat WhiteBalcane_Gray(cv::Mat src) { cv::Mat result = src.clone(); if (src.channels() != 3) { cout << "The number of image channels is not 3." << endl; return result; } // 通道分离 vector<cv::Mat> Channel; cv::split(src, Channel); // 计算通道灰度值的平均值 double Bm = cv::mean(Channel[0])[0]; double Gm = cv::mean(Channel[1])[0]; double Rm = cv::mean(Channel[2])[0]; double Km = (Bm Gm Rm) / 3; // 调整通道灰度值 Channel[0] *= Km / Bm; Channel[1] *= Km / Gm; Channel[2] *= Km / Rm; // 合并通道 cv::merge(Channel, result); return result; }
C 测试代码
#include <iostream> #include <opencv.hpp> using namespace std; // 白平衡-灰度世界 cv::Mat WhiteBalcane_Gray(cv::Mat src) { cv::Mat result = src.clone(); if (src.channels() != 3) { cout << "The number of image channels is not 3." << endl; return result; } // 通道分离 vector<cv::Mat> Channel; cv::split(src, Channel); // 计算通道灰度值的平均值 double Bm = cv::mean(Channel[0])[0]; double Gm = cv::mean(Channel[1])[0]; double Rm = cv::mean(Channel[2])[0]; double Km = (Bm Gm Rm) / 3; // 调整通道灰度值 Channel[0] *= Km / Bm; Channel[1] *= Km / Gm; Channel[2] *= Km / Rm; // 合并通道 cv::merge(Channel, result); return result; } int main() { // 载入原图 cv::Mat src = cv::imread("test.jpg"); // 白平衡-灰度世界 cv::Mat result = WhiteBalcane_Gray(src); // 显示 cv::imshow("src", src); cv::imshow("result", result); cv::waitKey(0); return 0; }
测试效果

如图1所示,这是一张晚上的图像。众所周知,晚上的色温很低。此时,如果您使用高于晚上色温的色温值拍照,您将获得暖色图片,为黄色;白平衡,使图片颜色回到真实环境色温,得到图2的效果。
如图3所示,这是一个颜色相对一致的图像,整体为粉色系统。此时,应用灰度世界算法,图像将进行整体调整,使颜色接近灰色;如果你感兴趣,你可以看看颜色条。三通道的值约为180-220,差别不大。平衡后的三个值接近190,因此为灰色。
接下来做一个有趣的测试,把原来的粉色壁纸设置成纯绿色。
如图5所示,由于图像中有两部分颜色相冲,在白平衡后,原始绿色将调整为深绿色,图像绿色重量减少,其他重量增加,导致原始粉红色肖像区域更粉红色,这也是该算法的缺点。这个测试也是为了帮助您更全面和深入地理解算法应用场景。
最近乘风破浪3开播了,大家支持王心凌姐姐吧~
如果函数有什么可以改进和改进的,欢迎指出为什么不一起进步呢?~
如果文章对你有帮助,你可以点赞让我知道,我会很开心的~加油!