C++ OpenCV實(shí)現(xiàn)白平衡之灰度世界算法
實(shí)現(xiàn)原理
白平衡的意義在于,對(duì)在特定光源下拍攝時(shí)出現(xiàn)的偏色現(xiàn)象,通過加強(qiáng)對(duì)應(yīng)的補(bǔ)色來進(jìn)行補(bǔ)償,使白色物體能還原為白色。
灰度世界算法是白平衡各種算法中最基本的一種。它假設(shè)圖像世界具備豐富色彩,紅藍(lán)綠三通道的灰度值在平均后趨近一致,該值作為“灰色”;若各通道均值偏離“灰色”,則將其進(jìn)行補(bǔ)償,使其回歸“灰色”,進(jìn)而實(shí)現(xiàn)白平衡的效果。
通俗的講,若圖像中綠色較強(qiáng),藍(lán)色和紅色較弱,則用了灰度世界算法后,綠色會(huì)適當(dāng)減弱,藍(lán)色和紅色會(huì)適當(dāng)加強(qiáng),這樣就使原本偏色嚴(yán)重的情況得到了緩解。
灰度世界算法的實(shí)現(xiàn)流程如下:
1.計(jì)算圖像RGB三通道各自的灰度平均值Raver、Gaver、Baver。
2.計(jì)算“灰色”:Gray=(Raver+Gaver+Baver)/3。
3.計(jì)算三通道的補(bǔ)償系數(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); // 計(jì)算通道灰度值均值 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++測(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); // 計(jì)算通道灰度值均值 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; }
測(cè)試效果
圖1 原圖
圖2 白平衡后圖像
如圖1所示,是傍晚的一張圖像,眾所周知,傍晚的色溫是較低的,此時(shí)采用高于傍晚色溫的色溫值拍照,就會(huì)得到一張暖色系的圖片,偏黃;對(duì)其進(jìn)行白平衡,使圖片顏色回歸真實(shí)的環(huán)境色溫,就得到如圖2的效果。
圖3 單色原圖
圖4 白平衡后圖像
如圖3所示,是一張色彩相對(duì)一致的圖像,整體呈粉色系,此時(shí)應(yīng)用灰度世界算法,圖像會(huì)整體調(diào)整,使得顏色趨近于灰色;感興趣的可以去看看該顏色的色條,三通道的數(shù)值在180-220左右,沒有過大的差異,平衡后三數(shù)值接近于190,因而呈灰色。
接下來做個(gè)有趣的測(cè)試,將原本粉色的墻紙?jiān)O(shè)為較純的綠色。
圖5 調(diào)色后的圖像
圖6 白平衡后效果
如圖5所示,因?yàn)閳D像中存在色調(diào)相沖的兩個(gè)部分,在白平衡后,原本的綠色會(huì)調(diào)整為深綠色,圖像綠色分量降低,其他分量升高,這就導(dǎo)致原本偏粉色的人像區(qū)更粉了,這也是該算法的弊端。做該測(cè)試也是為了幫助大家更全面深層地理解算法應(yīng)用場景。
以上就是C++ OpenCV實(shí)現(xiàn)白平衡之灰度世界算法的詳細(xì)內(nèi)容,更多關(guān)于C++ OpenCV灰度世界算法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
淺談c++ 字符類型總結(jié)區(qū)別wchar_t,char,WCHAR
下面小編就為大家?guī)硪黄獪\談c++ 字符類型總結(jié)區(qū)別wchar_t,char,WCHAR。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03C++示例講解friend static const關(guān)鍵字的用法
靜態(tài)成員static是解決同一個(gè)類的不同對(duì)象之間數(shù)據(jù)和函數(shù)共享問題。區(qū)分全局變量,全局變量也能實(shí)現(xiàn)數(shù)據(jù)共享,但安全性和封裝性被破壞了,友元提供了不同類或?qū)ο蟮某蓡T函數(shù)之間、類的成員函數(shù)與一般函數(shù)之間進(jìn)行數(shù)據(jù)共享的機(jī)制,const常引用-被引用的對(duì)象不能被更新2022-06-06C++基于蔡基姆拉爾森計(jì)算公式實(shí)現(xiàn)由年月日確定周幾的方法示例
這篇文章主要介紹了C++基于蔡基姆拉爾森計(jì)算公式實(shí)現(xiàn)由年月日確定周幾的方法,涉及C++針對(duì)日期時(shí)間的數(shù)值運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2017-07-07C/C++ 中const關(guān)鍵字的用法小結(jié)
C++中的const關(guān)鍵字的用法非常靈活,而使用const將大大改善程序的健壯性。這篇文章主要介紹了C/C++ 中const關(guān)鍵字的用法,需要的朋友可以參考下2020-02-02C語言 自增自減運(yùn)算的區(qū)別詳解及實(shí)例
這篇文章主要介紹了C語言中的++a和a++的區(qū)別詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-05-05C語言實(shí)現(xiàn)飛機(jī)售票系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)飛機(jī)售票系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05