15

ドキュメントで提供されている関数を使用して、8 ビット深度のRGBMat画像を表す特定のものをLabに変換しようとしています。

cvtColor(source, destination, <conversion code>);

次の変換コードを試しました。

CV_RGB2Lab
CV_BGR2Lab
CV_LBGR2Lab

私は毎回奇妙な結果を受け取りました。いくつかのサンプルでは、​​「L」値が 100 を超えており、文字通り <107, 125, 130> です。

Photoshop も使用して結果を確認していますが、107 が 0 ≤ L ≤ 100 の許容範囲を超えているため、エラーが何であるかを理解できません。

更新: 全体的な結果をここに投稿します: 8 ビット BGR で表される画像 (Mat) が与えられた場合、画像は次のように変換できます。

cvtColor(source, destination, CV_BGR2Lab);

ピクセル値は、次の方法でアクセスできます。

int step = destination.step;
int channels = destination.channels();
for (int i = 0; i < destination.rows(); i++) {
    for (int j = 0; j < destination.cols(); j++) {
        Point3_<uchar> pixelData;
        //L*: 0-255 (elsewhere is represented by 0 to 100)
        pixelData.x = destination.data[step*i + channels*j + 0];
        //a*: 0-255 (elsewhere is represented by -127 to 127)
        pixelData.y = destination.data[step*i + channels*j + 1];
        //b*: 0-255 (elsewhere is represented by -127 to 127)
        pixelData.z = destination.data[step*i + channels*j + 2];
    }
}
4

4 に答える 4

12

これは、 L値がOpenCVの範囲[0..255]にあるためです。この値を必要な間隔 (この場合は[0..100] ) に単純にスケーリングできます。

于 2012-07-08T20:49:14.960 に答える
4

João Abrantes の A と B の範囲についてはよくわかりません。

opencvのドキュメントには、範囲が明確に記載されていCIE L*a*b*ます。

一般範囲

  • 8ビット画像

    8_bit イメージの範囲

したがって、次の範囲につながります

0 <= L <= 255
0 <= a <= 255
0 <= b <= 255
于 2016-02-24T16:35:03.640 に答える
0

誰かが同じ問題に遭遇した場合:

OpenCV (2.4.13) では、 CV_32FC3 BGR 画像を Lab 色空間に変換できないことに注意してください。つまり、次のようになります。

//this->xImage is CV_8UC3
this->xImage.convertTo(FloatPrecisionImage, CV_32FC3);
Mat result;
cvtColor(FloatPrecisionImage, result, COLOR_BGR2Lab);
this->xImage = result;

動作しませ

Mat result;
cvtColor(this->xImage, result, COLOR_BGR2Lab);
result.convertTo(this->xImage, CV_32FC3);

魅力のように機能します。私はその行動の理由を追跡しませんでした。ただし、これは事実上、画像の品質に制限を課すため、私には不適切に思えます。

于 2017-09-27T08:57:37.627 に答える