中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

自動白平衡之完美反射算法原理及C++實現是怎樣的

發布時間:2021-11-15 16:22:52 來源:億速云 閱讀:273 作者:柒染 欄目:大數據

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

前言

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

算法原理

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

算法過程

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

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

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

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

代碼實現

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++實現是怎樣的

自動白平衡之完美反射算法原理及C++實現是怎樣的

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

惠州市| 岐山县| 双辽市| 屏山县| 微博| 平顺县| 元氏县| 顺义区| 务川| 砚山县| 黎川县| 河北省| 保靖县| 高淳县| 仁寿县| 牡丹江市| 同心县| 嘉祥县| 涿鹿县| 蓝山县| 清水县| 乐清市| 盐源县| 阿克陶县| 龙游县| 永福县| 施秉县| 印江| 昭通市| 梓潼县| 吴川市| 济南市| 浦江县| 博客| 宣威市| 铜鼓县| 北宁市| 尉犁县| 宁乡县| 建德市| 洛隆县|