0

使用 OpenCV。

我有一个 RGB 图像,每个值都是一个浮点数。我还有一个标准的色彩校正矩阵 3x4。

在图像上“应用”这个矩阵的最快方法是什么?

如果你不知道颜色校正......这是一个简单的矩阵运算。

如果图像看起来像这样(每个像素是 3 个浮点数):

R G B
R G B
R G B
R G B
R G B
.
.
.

然后我想执行以下操作:

1 R G B     [ A1, A2, A3 ] 
1 R G B     [ R1, R2, R3 ]
1 R G B  *  [ G1, G2, G3 ]
1 R G B     [ B1, B2, B3 ]
1 R G B
.
.
.

3x4 矩阵中的所有值都是常数。

谢谢。

4

2 回答 2

1

乘以颜色校正矩阵的 rgb 部分:

transform(imageIn,imageOut,M3x3);

然后加入A通道校正:

add(imageOut,Scalar(A1,A2,A3),imageOut);

在opencv2refman阅读有关转换的信息 ,这意味着您可以使用

transfrom(imageIn,imageOut,M4X3);

一步获得相同的结果(它确实 dst(I) = mtx · [src(I);1],非常有帮助),避免了添加 A 组件。对不起,如果那应该是 M3X4。当谈到矩阵数学,行与列,哪个是第一位的时,我非常有阅读障碍。

于 2012-09-10T00:50:02.527 回答
0

如果您确定矩阵中的值存储在 RGB 中(默认情况下 OpenCV 在 BGR 模式下读取它们),您可以继续进行简单的矩阵乘法运算。您只需创建包含您指定的 RGB 值的正确矩阵,即 1,R,G,B 1,R,G,B, ...,原始图像中每个像素 1 行

这是你可以做的(在 C++ 中)

// say img is your original RGB matrix, transform is your transformation matrix

std::vector<cv::Mat> channels;
// this extracts the R,G and B channels in single matrices
cv::split(img, channels);
// create a matrix on ones in floating point
cv::Mat oneMat = cv::Mat::ones(img.size(), CV_32F);
oneMat.push_front(channels);
// now channels is a vector containing 4 matrices of the same dimension as img
// you want to group those matrix into 1 single matrix of same dimension and 4 channels
// 1, R, G, B
cv::Mat rgbOne;
cv::merge(channels, rgbOne);
// Transform the row by col, 4 channel matrix rgbOne into a row*col, 4, single channel matrix prior to multiplication
cv::Mat reshaped = rgbOne.reshape(1, rgbOne.rows*rgbOne.cols);
// reshape is very fast as no allocation is required, check documentation

// now simply do the matrix multiplication
cv::Mat colorCorrectedImage = reshaped*transform;

// get back colorCorrectedImage to it's original dimensions
cv::Mat colorCoorectedReshaped = colorCorrectedImage.reshape(4, rgbOne.rows);
// note that you still have the extra channel of ones
// you can use split and merge functions as above to get rid of it and get your proper RGB image
于 2012-09-10T09:52:39.883 回答