本博文为软件课设学习历程的成果。

白平衡

白平衡是电视摄像,视频监控领域一个非常重要的概念,通过它可以解决色彩还原和色调处理的一系列问题。白平衡是随着电子影像再现色彩真实而产生的,在专业摄像领域白平衡应用的较早,现在家用电子产品(摄像头、数码照相机)中也广泛地使用,然而技术的发展使得白平衡调整变得越来越简单容易,但许多使用者还不甚了解白平衡的工作原理,理解上存在诸多误区。它是实现摄像机图像能精确反映被摄物的色彩状况,有手动白平衡和自动白平衡等方式,本文简要的介绍了灰度世界算法。本文源代码基于opencv3.4.1 +VS2017

 

灰度世界算法

灰度世界算法(Gray World)是以灰度世界假设为基础的,该假设认为对于一幅有着大量色彩变化的图像, R、 G、 B 三个分量的平均值趋于同一个灰度K。一般有两种方法来确定该灰度。

        (1)直接给定为固定值, 取其各通道最大值的一半,即取为127或128;

       (2)令 K = (Raver+Gaver+Baver)/3,其中Raver,Gaver,Baver分别表示红、 绿、 蓝三个通道的平均值。

         算法的第二步是分别计算各通道的增益:

             Kr=K/Raver;

       Kg=K/Gaver;

             Kb=K/Baver;

         算法第三步为根据Von Kries 对角模型,对于图像中的每个像素R、G、B,计算其结果值:

             Rnew = R * Kr;

       Gnew = G * Kg;

       Bnew = B * Kb;

         对于上式,计算中可能会存在溢出(>255,不会出现小于0的)现象,处理方式有两种。

         a、 直接将像素设置为255,这可能会造成图像整体偏白。

         b、 计算所有Rnew、Gnew、Bnew的最大值,然后利用该最大值将将计算后数据重新线性映射到[0,255]内。实践证明这种                 方式将会使图像整体偏暗,建议采用第一种方案。

        一般来说,灰度世界算法的效果还是比较好的呢,并且该算法的执行速度非常之快,目前也存在了不少对该算法进行改进            的效果。

实例

/*  灰度世界  */

#include <string.h>
#include <opencv2/core/core.hpp>  
#include <opencv2/highgui/highgui.hpp>  

using namespace cv;
using namespace std;

int main()
{
	Mat imageSource = imread("test1.jpg");
	imshow("原始图像", imageSource);
	vector<Mat> imageRGB;
	vector<int> a(2, 0);
	//RGB三通道分离
	split(imageSource, imageRGB);
	a[0] = 1;
	a[1] = 2;
	//求原始图像的RGB分量的均值
	double R, G, B;
	//B = mean(imageRGB[0])[0];

	G = mean(imageRGB[1])[0];
	R = mean(imageRGB[2])[0];
	Scalar sca = mean(imageRGB[0]);
	B = sca[0];
	//需要调整的RGB分量的增益
	double KR, KG, KB;
	KB = (R + G + B) / (3 * B);
	KG = (R + G + B) / (3 * G);
	KR = (R + G + B) / (3 * R);

	//调整RGB三个通道各自的值
	imageRGB[0] = imageRGB[0] * KB;
	imageRGB[1] = imageRGB[1] * KG;
	imageRGB[2] = imageRGB[2] * KR;

	//RGB三通道图像合并
	merge(imageRGB, imageSource);
	imshow("白平衡", imageSource);
	imwrite("灰度世界白平衡后.jpg", imageSource);
	waitKey();
	return 0;
}

测试图像:

opencv白平衡函数 opencv白平衡算法_灰度世界算法

                                                    

灰度世界白平衡后的图像:

opencv白平衡函数 opencv白平衡算法_opencv白平衡函数_02