导  读

    本文主要介绍OpenCV自带的三种白平衡算法使用(代码 + 效果)。

前 言

    OpenCV xphoto模块中提供了三种不同的白平衡算法,分别是:灰度世界算法、完美反射算法和基于学习的白平衡算法。本文将介绍其使用方法并给出代码演示,供大家参考。

使用演示

    因为xphoto模组是在OpenCV扩展部分,所以需要CMake编译contrib代码,这部分前面已介绍过多次,此处略过。下面是源码文件和编译后的头文件:

    【1】灰度世界(GrayworldWB)-白平衡算法。

    参考链接:

https://docs.opencv.org/4.x/d7/d71/classcv_1_1xphoto_1_1GrayworldWB.html#details

    代码演示与效果:

// grayWorld_WhiteBalance.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include #include #include

using namespace std;using namespace cv;using namespace cv::xphoto;

int main(){ Mat src = imread("F.png"); imshow("src", src);    Ptr gw = createGrayworldWB(); Mat result; gw->balanceWhite(src, result); imshow("result", result); waitKey();}

效果对比(左:原图,右:白平衡算法结果图)

    【2】完美反射(SimpleWB)-白平衡算法。

    参考链接:

https://docs.opencv.org/4.x/d1/d8b/classcv_1_1xphoto_1_1SimpleWB.html#details

    代码演示与效果:‍​​​​​​​

#include #include #include

using namespace std;using namespace cv;using namespace cv::xphoto;

int main(){ Mat src = imread("F.png"); imshow("src", src);     Ptr sw = createSimpleWB(); Mat result; sw->balanceWhite(src, result); imshow("result", result); waitKey();}

效果对比(左:原图,右:白平衡算法结果图)

    【3】基于学习的(LearningBasedWB)-白平衡算法。

    参考链接:

https://docs.opencv.org/4.x/dc/dcb/tutorial_xphoto_training_white_balance.html

    许多传统的白平衡算法都是基于统计的,即它们依赖于这样一个事实:某些假设应该在正确白平衡的图像中成立,例如众所周知的灰色世界假设。然而,通过在基于学习的框架中利用具有地面实况光源的大型图像数据集,通常可以获得更好的结果。下面如何训练基于学习的白平衡算法并评估结果的质量。

下载数据集进行训练。在本教程中,我们将使用Gehler-Shi 数据集。将所有 568 张训练图像提取到一个文件夹中。单独下载包含真实光源值 (real_illum_568..mat) 的文件。 我们将使用Python 脚本(learn_color_balance.py)进行训练。使用以下参数调用它: python learn_color_balance.py -i <包含训练图像的文件夹的路径> -g -r 0,378 --num_trees 30 --max_tree_depth 6 --num_augmented 0 这应该开始在前 378 个图像(整个数据集的 2/3)上训练模型。我们将模型的大小设置为每个特征 30 个回归树对,并将树深度限制为不超过 6。默认情况下,生成的模型将保存到 color_balance_model.yml 在构建 LearningBasedWB 实例时,通过传递其路径来使用经过训练的模型: Ptr wb = xphoto::createLearningBasedWB (modelFilename);

简单来说就是通过给定数据集,一部分未经过白平衡矫正的图像,大概是下面这样:

目标图像也就是希望得到的白平衡矫正结果groundtruth,大概是下面这样,或者效果更好:

通过训练我们能得到一些参数,直接应用到新的图像上。训练好的参数模型保存到color_balance_model.yml文件中,使用时加载即可:

#include #include #include

using namespace std;using namespace cv;using namespace cv::xphoto;

int main(){ Mat src = imread("F.png"); imshow("src", src);    Ptr lbw = createLearningBasedWB("color_balance_model.yml"); Mat result; lbw->balanceWhite(src, result); imshow("result", result); waitKey();}

大家可以感兴趣的话可以自己尝试一下。

—THE END—

精彩文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: