我想从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;
}
}
}
答案 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通道图像。我不知道应用任意像素方式矩阵变换的函数。