溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

自動白平衡之完美反射算法原理及C++實(shí)現(xiàn)是怎樣的

發(fā)布時間:2021-11-15 16:22:52 來源:億速云 閱讀:270 作者:柒染 欄目:大數(shù)據(jù)

這篇文章給大家介紹自動白平衡之完美反射算法原理及C++實(shí)現(xiàn)是怎樣的,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

前言

昨天介紹的灰度世界算法是最原始的處理白平衡的算法。今天要介紹的完美反射算法也是自動白平衡常用的算法之一。一起來看看吧。

算法原理

完美反射理論假設(shè)圖像中最亮的點(diǎn)就是白點(diǎn),并以此白點(diǎn)為參考對圖像進(jìn)行自動白平衡,最亮點(diǎn)定義為R+G+B的最大值。

算法過程

  1. 計算每個像素R,G,B之后,并保存

  2. 按照R+G+B的值的大小計算出其前10%或其他Ratio的白色參考點(diǎn)的閾值T

  3. 遍歷圖像中的每個點(diǎn),計算其中R+G+B值大于T的所有點(diǎn)的R\G\B分量的累積和的平均值

  4. 將每個像素量化到[0, 255]

代碼實(shí)現(xiàn)

Mat PerfectReflectionAlgorithm(Mat src) {  int row = src.rows;  int col = src.cols;  Mat dst(row, col, CV_8UC3);  int HistRGB[767] = { 0 };  int MaxVal = 0;  for (int i = 0; i < row; i++) {    for (int j = 0; j < col; j++) {      MaxVal = max(MaxVal, (int)src.at<Vec3b>(i, j)[0]);      MaxVal = max(MaxVal, (int)src.at<Vec3b>(i, j)[1]);      MaxVal = max(MaxVal, (int)src.at<Vec3b>(i, j)[2]);      int sum = src.at<Vec3b>(i, j)[0] + src.at<Vec3b>(i, j)[1] + src.at<Vec3b>(i, j)[2];      HistRGB[sum]++;    }  }  int Threshold = 0;  int sum = 0;  for (int i = 766; i >= 0; i--) {    sum += HistRGB[i];    if (sum > row * col * 0.1) {      Threshold = i;      break;    }  }  int AvgB = 0;  int AvgG = 0;  int AvgR = 0;  int cnt = 0;  for (int i = 0; i < row; i++) {    for (int j = 0; j < col; j++) {      int sumP = src.at<Vec3b>(i, j)[0] + src.at<Vec3b>(i, j)[1] + src.at<Vec3b>(i, j)[2];      if (sumP > Threshold) {        AvgB += src.at<Vec3b>(i, j)[0];        AvgG += src.at<Vec3b>(i, j)[1];        AvgR += src.at<Vec3b>(i, j)[2];        cnt++;      }    }  }  AvgB /= cnt;  AvgG /= cnt;  AvgR /= cnt;  for (int i = 0; i < row; i++) {    for (int j = 0; j < col; j++) {      int Blue = src.at<Vec3b>(i, j)[0] * MaxVal / AvgB;      int Green = src.at<Vec3b>(i, j)[1] * MaxVal / AvgG;      int Red = src.at<Vec3b>(i, j)[2] * MaxVal / AvgR;      if (Red > 255) {        Red = 255;      }      else if (Red < 0) {        Red = 0;      }      if (Green > 255) {        Green = 255;      }      else if (Green < 0) {        Green = 0;      }      if (Blue > 255) {        Blue = 255;      }      else if (Blue < 0) {        Blue = 0;      }      dst.at<Vec3b>(i, j)[0] = Blue;      dst.at<Vec3b>(i, j)[1] = Green;      dst.at<Vec3b>(i, j)[2] = Red;    }  }  return dst;}

效果

自動白平衡之完美反射算法原理及C++實(shí)現(xiàn)是怎樣的

自動白平衡之完美反射算法原理及C++實(shí)現(xiàn)是怎樣的

關(guān)于自動白平衡之完美反射算法原理及C++實(shí)現(xiàn)是怎樣的就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI