欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++ OpenCV實現(xiàn)白平衡之灰度世界算法

 更新時間:2022年05月30日 09:56:37   作者:翟天保Steven  
灰度世界算法是白平衡各種算法中最基本的一種。本文將利用C++和OpenCV實現(xiàn)白平衡中的灰度世界算法,文中示例代碼講解詳細,感興趣的可以了解一下

實現(xiàn)原理

白平衡的意義在于,對在特定光源下拍攝時出現(xiàn)的偏色現(xiàn)象,通過加強對應的補色來進行補償,使白色物體能還原為白色。

灰度世界算法是白平衡各種算法中最基本的一種。它假設(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所示,是一張色彩相對一致的圖像,整體呈粉色系,此時應用灰度世界算法,圖像會整體調(diào)整,使得顏色趨近于灰色;感興趣的可以去看看該顏色的色條,三通道的數(shù)值在180-220左右,沒有過大的差異,平衡后三數(shù)值接近于190,因而呈灰色。

接下來做個有趣的測試,將原本粉色的墻紙設(shè)為較純的綠色。

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

圖6 白平衡后效果

如圖5所示,因為圖像中存在色調(diào)相沖的兩個部分,在白平衡后,原本的綠色會調(diào)整為深綠色,圖像綠色分量降低,其他分量升高,這就導致原本偏粉色的人像區(qū)更粉了,這也是該算法的弊端。做該測試也是為了幫助大家更全面深層地理解算法應用場景。

以上就是C++ OpenCV實現(xiàn)白平衡之灰度世界算法的詳細內(nèi)容,更多關(guān)于C++ OpenCV灰度世界算法的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C語言實例梳理講解常用關(guān)鍵字的用法

    C語言實例梳理講解常用關(guān)鍵字的用法

    關(guān)鍵字是C語言非常重要的一部分,熟練的掌握和使用關(guān)鍵字有助于我們更加熟悉了解C語言,同時C語言的關(guān)鍵字也是面試筆試中??嫉膬?nèi)容。C語言的關(guān)鍵字共有32個,但并不是每個關(guān)鍵字都有坑,本篇文章將通過理論聯(lián)系實際的方式為大家講解C語言中易混易錯以及??嫉囊恍╆P(guān)鍵字
    2022-05-05
  • 淺談c++ 字符類型總結(jié)區(qū)別wchar_t,char,WCHAR

    淺談c++ 字符類型總結(jié)區(qū)別wchar_t,char,WCHAR

    下面小編就為大家?guī)硪黄獪\談c++ 字符類型總結(jié)區(qū)別wchar_t,char,WCHAR。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • 進程間通信之深入消息隊列的詳解

    進程間通信之深入消息隊列的詳解

    本篇文章是對消息隊列的應用進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C++示例講解friend static const關(guān)鍵字的用法

    C++示例講解friend static const關(guān)鍵字的用法

    靜態(tài)成員static是解決同一個類的不同對象之間數(shù)據(jù)和函數(shù)共享問題。區(qū)分全局變量,全局變量也能實現(xiàn)數(shù)據(jù)共享,但安全性和封裝性被破壞了,友元提供了不同類或?qū)ο蟮某蓡T函數(shù)之間、類的成員函數(shù)與一般函數(shù)之間進行數(shù)據(jù)共享的機制,const常引用-被引用的對象不能被更新
    2022-06-06
  • C++基于蔡基姆拉爾森計算公式實現(xiàn)由年月日確定周幾的方法示例

    C++基于蔡基姆拉爾森計算公式實現(xiàn)由年月日確定周幾的方法示例

    這篇文章主要介紹了C++基于蔡基姆拉爾森計算公式實現(xiàn)由年月日確定周幾的方法,涉及C++針對日期時間的數(shù)值運算相關(guān)操作技巧,需要的朋友可以參考下
    2017-07-07
  • C/C++ 中const關(guān)鍵字的用法小結(jié)

    C/C++ 中const關(guān)鍵字的用法小結(jié)

    C++中的const關(guān)鍵字的用法非常靈活,而使用const將大大改善程序的健壯性。這篇文章主要介紹了C/C++ 中const關(guān)鍵字的用法,需要的朋友可以參考下
    2020-02-02
  • c語言 兩字符串交叉合并實例

    c語言 兩字符串交叉合并實例

    今天小編就為大家分享一篇c語言 兩字符串交叉合并實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • C語言 自增自減運算的區(qū)別詳解及實例

    C語言 自增自減運算的區(qū)別詳解及實例

    這篇文章主要介紹了C語言中的++a和a++的區(qū)別詳解及實例的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • 用C語言實現(xiàn)單鏈表的各種操作(一)

    用C語言實現(xiàn)單鏈表的各種操作(一)

    本篇文章是對用C語言實現(xiàn)單鏈表的各種操作進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言實現(xiàn)飛機售票系統(tǒng)

    C語言實現(xiàn)飛機售票系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)飛機售票系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05

最新評論