这段代码有啥问题应该在opencv中进行白平衡

Posted

技术标签:

【中文标题】这段代码有啥问题应该在opencv中进行白平衡【英文标题】:what is wrong with this code that should do whitebalancing in opencv这段代码有什么问题应该在opencv中进行白平衡 【发布时间】:2013-09-13 12:28:43 【问题描述】:

我有这个代码:

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

可以看出,平均值发生了变化,但它们不相等,但它们都应该等于最大值。

我没有得到这个的任何原因?

我该如何解决?

【问题讨论】:

【参考方案1】:

我的猜测是矩阵的数据类型类似于 CV_8UC3,这意味着像素存储为无符号 8 位值。

当您进行缩放时,缩放后的结果会被限制在 0 到 255 的范围内,因此平均值不会改变相同的缩放量。

例如,假设我们有值:

0 , 64 , 64 , 128

并尝试按 4 倍缩放。

结果是:

0, 255, 255, 255 

如果这是问题所在,那么您可能希望使用convertTo 方法将您的矩阵更改为具有更大动态范围的不同数据类型(例如浮点数据类型)。

请注意,convertTo 方法还有一个可选的缩放(和偏移),因此您可以在转换数据类型时应用缩放。

【讨论】:

以上是关于这段代码有啥问题应该在opencv中进行白平衡的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV-白平衡(完美反射算法)

Halcon - 如何设置白平衡

带有灰色世界假设的自动白平衡

工业相机进行白平衡校正以后,为啥拍出的图像还是失真很严重啊,还有没有其它方法可以进行改进的啊

这段代码有啥问题?应用程序应该获取位置

如何调节白平衡