从wiki实现白平衡算法

时间:2013-04-12 14:35:40

标签: c++ opencv

我想从wiki实现一些白平衡算法 http://en.wikipedia.org/wiki/Color_balance

它们只是一些简单的矩阵操作 openCV提供任何功能来进行一些乘法 在一组像素如下?

例如,2 x 2,3通道Mat A =

0 0 0 1 1 1
2 2 2 3 3 3

3 x 3,1个通道Mat B =

1 0 0
0 2 0
0 0 3

A x B = C且C =

0 0 0 1 2 3
2 4 6 3 6 9

我已经编写了一些通用函数来处理像素转换 但我更喜欢openCV的功能,如果它存在的话 openCV的功能可以做一些优化

template<typename T, typename UnaryFunctor>
void transform_channel(cv::Mat &src, int channel, UnaryFunctor functor)
{
    int const channels = src.channels();
    if(channels == 1 && src.isContinuous()){
        return transform_continuous_channel<T>(src, functor);
    }

    for(int row = 0; row != src.rows; ++row)
    {
        auto dst_ptr = get_pointer<T>(src, row, channel);
        for(int col = 0; col != src.cols; ++col){
            *dst_ptr = functor(*dst_ptr);
            dst_ptr += channels;
        }
    }
}

2 个答案:

答案 0 :(得分:1)

矩阵乘法是在OpenCV中使用*运算符实现的。 如果你想让它工作,你应该使用cv::Mat::reshape()(文档here)将RGB图像重塑为单通道矩阵。

提示:cv::Mat::reshape()返回对新矩阵的引用,而不复制数据(不必要且缓慢)。因此,使用它通常是个好主意:

cv::Mat someMatrix;
someMatrix = someMatrix.reshape(1);

或者这种方式(使用另一个矩阵变量):

cv::Mat rgbMatrix, myMatrix;
myMatrix = rgbMatrix.reshape(1);

同样,我强调这不会复制数据,因此您不会丢失任何内存。

答案 1 :(得分:1)

您会注意到色彩平衡操作仅由对角矩阵组成,对应于标量乘元素乘法。因此,您的示例中的转换将是:

image = image.mul(cv::Scalar(1,2,3));

表示3通道图像。我不知道应用任意像素方式矩阵变换的函数。