导 读
本文主要介绍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 <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/xphoto/white_balance.hpp>
using namespace std;
using namespace cv;
using namespace cv::xphoto;
int main()
{
mat src = imread("f.png");
imshow("src", src);
ptr<grayworldwb> 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 <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/xphoto/white_balance.hpp>
using namespace std;
using namespace cv;
using namespace cv::xphoto;
int main()
{
mat src = imread("f.png");
imshow("src", src);
ptr<simplewb> 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 <real_illum_568..mat的路径> -r 0,378 --num_trees 30 --max_tree_depth 6 --num_augmented 0
这应该开始在前 378 个图像(整个数据集的 2/3)上训练模型。我们将模型的大小设置为每个特征 30 个回归树对,并将树深度限制为不超过 6。默认情况下,生成的模型将保存到 color_balance_model.yml
-
在构建 learningbasedwb 实例时,通过传递其路径来使用经过训练的模型:
ptr<xphoto::learningbasedwb> wb = xphoto::createlearningbasedwb (modelfilename);
简单来说就是通过给定数据集,一部分未经过白平衡矫正的图像,大概是下面这样:
目标图像也就是希望得到的白平衡矫正结果groundtruth,大概是下面这样,或者效果更好:
通过训练我们能得到一些参数,直接应用到新的图像上。训练好的参数模型保存到color_balance_model.yml文件中,使用时加载即可:
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/xphoto/white_balance.hpp>
using namespace std;
using namespace cv;
using namespace cv::xphoto;
int main()
{
mat src = imread("f.png");
imshow("src", src);
ptr<learningbasedwb> lbw = createlearningbasedwb("color_balance_model.yml");
mat result;
lbw->balancewhite(src, result);
imshow("result", result);
waitkey();
}
大家可以感兴趣的话可以自己尝试一下。
—the end—
发表评论