0

我想从 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;
        }
    }
}
4

2 回答 2

1

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

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

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

或者这样(使用另一个矩阵变量):

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

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

于 2013-04-12T14:50:59.680 回答
1

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

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

对于 3 通道图像。我不知道应用任意像素矩阵变换的函数。

于 2013-04-12T18:55:14.210 回答