C++ OpenCV實現(xiàn)白平衡之灰度世界算法
實現(xiàn)原理
白平衡的意義在于,對在特定光源下拍攝時出現(xiàn)的偏色現(xiàn)象,通過加強對應(yīng)的補色來進行補償,使白色物體能還原為白色。
灰度世界算法是白平衡各種算法中最基本的一種。它假設(shè)圖像世界具備豐富色彩,紅藍綠三通道的灰度值在平均后趨近一致,該值作為“灰色”;若各通道均值偏離“灰色”,則將其進行補償,使其回歸“灰色”,進而實現(xiàn)白平衡的效果。
通俗的講,若圖像中綠色較強,藍色和紅色較弱,則用了灰度世界算法后,綠色會適當減弱,藍色和紅色會適當加強,這樣就使原本偏色嚴重的情況得到了緩解。
灰度世界算法的實現(xiàn)流程如下:
1.計算圖像RGB三通道各自的灰度平均值Raver、Gaver、Baver。
2.計算“灰色”:Gray=(Raver+Gaver+Baver)/3。
3.計算三通道的補償系數(shù),即灰色值除以單通道平均值。
功能函數(shù)代碼
// 白平衡-灰度世界
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;
// 通道灰度值調(diào)整
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;
// 通道灰度值調(diào)整
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 白平衡后圖像
如圖1所示,是傍晚的一張圖像,眾所周知,傍晚的色溫是較低的,此時采用高于傍晚色溫的色溫值拍照,就會得到一張暖色系的圖片,偏黃;對其進行白平衡,使圖片顏色回歸真實的環(huán)境色溫,就得到如圖2的效果。

圖3 單色原圖

圖4 白平衡后圖像
如圖3所示,是一張色彩相對一致的圖像,整體呈粉色系,此時應(yīng)用灰度世界算法,圖像會整體調(diào)整,使得顏色趨近于灰色;感興趣的可以去看看該顏色的色條,三通道的數(shù)值在180-220左右,沒有過大的差異,平衡后三數(shù)值接近于190,因而呈灰色。
接下來做個有趣的測試,將原本粉色的墻紙設(shè)為較純的綠色。

圖5 調(diào)色后的圖像

圖6 白平衡后效果
如圖5所示,因為圖像中存在色調(diào)相沖的兩個部分,在白平衡后,原本的綠色會調(diào)整為深綠色,圖像綠色分量降低,其他分量升高,這就導(dǎo)致原本偏粉色的人像區(qū)更粉了,這也是該算法的弊端。做該測試也是為了幫助大家更全面深層地理解算法應(yīng)用場景。
以上就是C++ OpenCV實現(xiàn)白平衡之灰度世界算法的詳細內(nèi)容,更多關(guān)于C++ OpenCV灰度世界算法的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
解析c語言中"函數(shù)調(diào)用中缺少哨兵"的情況分析
本篇文章是對c語言中"函數(shù)調(diào)用中缺少哨兵"的情況進行了詳細的分析介紹,需要的朋友參考下2013-05-05
C++ 將數(shù)據(jù)轉(zhuǎn)為字符串的幾種方法
這篇文章主要介紹了C++ 將數(shù)據(jù)轉(zhuǎn)為字符串的幾種方法,十分的實用,有需要的小伙伴可以參考下。2015-06-06
string中c_str(),data(),copy(p,n)函數(shù)的用法總結(jié)
以下是對string中c_str(),data(),copy(p,n)函數(shù)的用法進行了詳細的介紹,需要的朋友可以過來參考下2013-09-09
C++中函數(shù)模板與類模板的簡單使用及區(qū)別介紹
這篇文章介紹了C++中的模板機制,包括函數(shù)模板和類模板的概念、語法和實際應(yīng)用,函數(shù)模板通過類型參數(shù)實現(xiàn)泛型操作,而類模板允許創(chuàng)建可處理多種數(shù)據(jù)類型的類,文章還討論了模板的關(guān)鍵區(qū)別、注意事項以及它們在實際編程中的應(yīng)用,感興趣的朋友一起看看吧2025-03-03

