服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++ OpenCV实现白平衡之灰度世界算法

C++ OpenCV实现白平衡之灰度世界算法

2022-12-12 12:22翟天保Steven C/C++

灰度世界算法是白平衡各种算法中最基本的一种。本文将利用C++和OpenCV实现白平衡中的灰度世界算法,文中示例代码讲解详细,感兴趣的可以了解一下

实现原理

白平衡的意义在于,对在特定光源下拍摄时出现的偏色现象,通过加强对应的补色来进行补偿,使白色物体能还原为白色。

灰度世界算法是白平衡各种算法中最基本的一种。它假设图像世界具备丰富色彩,红蓝绿三通道的灰度值在平均后趋近一致,该值作为“灰色”;若各通道均值偏离“灰色”,则将其进行补偿,使其回归“灰色”,进而实现白平衡的效果。

通俗的讲,若图像中绿色较强,蓝色和红色较弱,则用了灰度世界算法后,绿色会适当减弱,蓝色和红色会适当加强,这样就使原本偏色严重的情况得到了缓解。

灰度世界算法的实现流程如下:

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;
}

 

测试效果

C++ OpenCV实现白平衡之灰度世界算法

图1原图

C++ OpenCV实现白平衡之灰度世界算法

图2白平衡后图像

如图1所示,是傍晚的一张图像,众所周知,傍晚的色温是较低的,此时采用高于傍晚色温的色温值拍照,就会得到一张暖色系的图片,偏黄;对其进行白平衡,使图片颜色回归真实的环境色温,就得到如图2的效果。

C++ OpenCV实现白平衡之灰度世界算法

图3单色原图

C++ OpenCV实现白平衡之灰度世界算法

图4白平衡后图像

如图3所示,是一张色彩相对一致的图像,整体呈粉色系,此时应用灰度世界算法,图像会整体调整,使得颜色趋近于灰色;感兴趣的可以去看看该颜色的色条,三通道的数值在180-220左右,没有过大的差异,平衡后三数值接近于190,因而呈灰色。

接下来做个有趣的测试,将原本粉色的墙纸设为较纯的绿色。

C++ OpenCV实现白平衡之灰度世界算法

图5调色后的图像

C++ OpenCV实现白平衡之灰度世界算法

图6白平衡后效果

如图5所示,因为图像中存在色调相冲的两个部分,在白平衡后,原本的绿色会调整为深绿色,图像绿色分量降低,其他分量升高,这就导致原本偏粉色的人像区更粉了,这也是该算法的弊端。做该测试也是为了帮助大家更全面深层地理解算法应用场景。

以上就是C++ OpenCV实现白平衡之灰度世界算法的详细内容,更多关于C++ OpenCV灰度世界算法的资料请关注服务器之家其它相关文章!

原文链接:https://blog.csdn.net/zhaitianbao/article/details/125025766

延伸 · 阅读

精彩推荐
  • C/C++C++ 指向类成员的指针

    C++ 指向类成员的指针

    指向类成员的指针总的来讲可以分为两大类四小类(指向数据成员还是成员函数,指向普通成员还是静态成员)...

    AnnieKim7982021-08-26
  • C/C++C语言学生成绩管理系统源代码

    C语言学生成绩管理系统源代码

    这篇文章主要为大家详细介绍了C语言学生成绩管理系统源代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    唯一3672021-06-22
  • C/C++详细理解C语言的函数栈帧

    详细理解C语言的函数栈帧

    这篇文章主要为大家介绍了C语言的函数栈帧,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助,希望能够给你带来帮助...

    Ssorrymaker6242022-03-01
  • C/C++C++里最容易忽视却不能忽视的问题(必看)

    C++里最容易忽视却不能忽视的问题(必看)

    在C++里最容易忽视却不能忽视的问题都有哪些呢?下面小编就为大家介绍一下。一起跟随小编过来看看吧...

    C++教程网6952021-04-02
  • C/C++ubunt18.04LTS+vscode+anaconda3下的python+C++调试方法

    ubunt18.04LTS+vscode+anaconda3下的python+C++调试方法

    这篇文章主要介绍了ubunt18.04LTS+vscode+anaconda3下的python+C++调试方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友...

    做一只AI小能手8542021-08-30
  • C/C++Clion配置C语言环境的步骤详解

    Clion配置C语言环境的步骤详解

    这篇文章主要介绍了Clion配置C语言环境的步骤详解,本文分步骤通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,...

    mo_seele9372021-10-22
  • C/C++C语言关于注释的知识点总结

    C语言关于注释的知识点总结

    在本篇文章里小编给大家分享的是关于C语言关于注释的知识点总结,需要的朋友们可以参考学习下。...

    藏色散人6732021-08-17
  • C/C++C语言使用单链表实现学生信息管理系统

    C语言使用单链表实现学生信息管理系统

    这篇文章主要为大家详细介绍了C语言使用单链表实现学生信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考...

    威欸威5352022-03-01