0

OpenCVを使用。

RGB 画像があり、各値は float です。また、標準の色補正マトリックス 3x4 もあります。

この行列を画像に「適用」する最速の方法は何ですか?

色補正がわからない場合は... これは単純な行列演算です。

画像が次のようになっている場合 (各ピクセルは 3 つの float です):

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の transform について読んでください

transfrom(imageIn,imageOut,M4X3);

1 つのステップで同じ結果を得るには (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 に答える