2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 自动白平衡之完美反射算法原理及C++实现

自动白平衡之完美反射算法原理及C++实现

时间:2024-03-06 03:56:41

相关推荐

自动白平衡之完美反射算法原理及C++实现

自动白平衡之完美反射算法原理及C++实现

原文:/just_sort/article/details/85982871

算法原理

/Imageshop/archive//04/20/3032062.html在Imageshop前辈看到了这个完美反射算法用于自动白平衡的算法,此算法的原理是:完美反射理论假设图像中最亮的点就是白点,并以此白点为参考对图像进行自动白平衡,最亮点定义为R+G+B的最大值

算法步骤

计算每个像素R,G,B之后,并保存按照R+G+B的值的大小计算出其前10%或其他Ratio的白色参考点的阈值T遍历图像中的每个点,计算其中R+G+B值大于T的所有点的R\G\B分量的累积和的平均值将每个像素量化到[0, 255]

C++源码实现

#include <stdio.h>#include <iostream>#include <immintrin.h>#include <opencv2/opencv.hpp>#include <opencv2/core/core.hpp>#include <opencv2/ml/ml.hpp>#include "opencv2/highgui/highgui.hpp"using namespace cv;using namespace cv::ml;using namespace std;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;}int main() {Mat src = imread("F:\\child.jpg");Mat dst = PerfectReflectionAlgorithm(src);imshow("origin", src);imshow("result", dst);imwrite("F:\\res.jpg", dst);waitKey(0);}

效果

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。