这段应该在 OpenCV 中进行白平衡的代码有什么问题
what is wrong with this code that should do whitebalancing in opencv
我有这个代码:
vector<Mat> brg;
Mat output;
split(inputImage, brg);
double mb=mean(brg[0])[0];
double mg=mean(brg[1])[0];
double mr=mean(brg[2])[0];
cout << "mb "<< mb<< " mg "<< mg<< " mr "<< mr << endl;
double max=MAX(mb,MAX(mg,mr));
mb=max/mb;
mg=max/mg;
mr=max/mr;
brg[0]=brg[0] *mb;
brg[1]=brg[1] *mg;
brg[2]=brg[2] *mr;
{
double mb=mean(brg[0])[0];
double mg=mean(brg[1])[0];
double mr=mean(brg[2])[0];
cout << "mb "<< mb<< " mg "<< mg<< " mr "<< mr << endl;
}
merge(brg,output);
return output;
从数学角度来看,如果我将矩阵乘以一个数字,那么它的平均值应该乘以该数字,所以我应该在这个函数的末尾得到相同的 mb、mg、mr,但我没有得到。 我得到的结果如下:
mb 166.891 mg 176.319 mr 158.288
mb 169.619 mg 176.319 mr 164.149
可以看出,均值发生了变化,但它们不相等,但它们都应该等于最大值。
我没有得到这个的任何原因?
我该如何解决它?
我的猜测是矩阵的数据类型类似于CV_8UC3,这意味着像素存储为无符号的 8 位值。
缩放时,缩放结果将裁剪到 0 到 255 的范围,因此平均值不会以相同的缩放量更改。
例如,假设我们有值:
0 , 64 , 64 , 128
并尝试按 4 倍进行缩放。
结果将是:
0, 255, 255, 255
如果这是问题所在,则您可能希望使用 convertTo 方法将矩阵更改为具有更大动态范围的其他数据类型(如浮点数据类型)。
请注意,convertTo 方法还具有可选的小数位数(和偏移量),因此您可以在转换数据类型时应用缩放。
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 编写了一个C++代码来检查表达式是否具有平衡括号并且我的代码未运行.我已经卡了一天了
- 在代码厨师中得到错误的答案:平衡的比赛
- 以下代码使用堆栈标识平衡括号有什么问题
- 这段应该在 OpenCV 中进行白平衡的代码有什么问题
- 此代码如何检查平衡括号
- 高度平衡树代码中的分段错误