2

3 チャンネルの CV_8U 画像を、単一チャンネル CV_32S でなければならない画像に変換する必要があります。しかし、そうしようとすると、得られる画像はすべて黒です。コードが機能しない理由がわかりません。

私はグレースケール画像を扱っています。これが、3 チャンネル画像を単一チャンネル画像のベクトルに分割し、最初のチャンネルのみを処理する理由です。

//markers->Image() returns a valid image, so this is not the problem

cv::Mat dst(markers->Image().size(), CV_32SC1);
dst = cv::Scalar::all(0);
std::vector<cv::Mat> vectmp;
cv::split(markers->Image(), vectmp);
vectmp.at(0).convertTo(dst, CV_32S);

//vectmp.at(0) is ok, but dst is black...?

前もって感謝します。

4

4 に答える 4

3

結果画像の値を取得しようとしましたか?このような:

for (int i=0; i<result.rows; i++)
{
    for (int j=0; j<result.cols; j++)
    {
        cout << result.at<int>(i,j) << endl;
    }
}

convertToランダムなグレースケールシングルチャネル画像をCV_32S(各ピクセルの符号付き32ビット整数値)に変換(使用)しました。出力は次のようになりました。

80
111
132

そして、それを見せようとすると、黒い画像も表示されます。ドキュメントから:

画像が16ビット符号なしまたは32ビット整数の場合、ピクセルは256で除算されます。つまり、値の範囲[0,255*256]は[0,255]にマップされます。

したがって、これらの小さい数を255に分割すると、0(intタイプ)が得られます。そのため、imshow黒い画像が表示されます。

于 2013-03-11T11:12:53.133 に答える
0

私はこれがあなたが探しているものだと信じています。画像をこの 8 ビットの単一チャネルに変換します。CV_8UC1。8 ビットのイメージから始めて、それを 32 ビットのシングル チャネルに変更していますか? なんで?8ビットにしてください。

于 2013-12-28T19:36:08.463 に答える
0

32 ビット イメージを表示して意味のある結果を表示するには、 を呼び出す前に、そのすべての要素に 256 を掛ける必要がありますimshow。それ以外の場合は、imshow値をゼロに縮小すると、黒い画像が得られます (Astor が指摘したように)。

元の値は 8 ビット符号なしであるため、255 未満である必要があります。したがって、256 を掛けても安全であり、32 ビット整数がオーバーフローすることはありません。

EDIT出力タイプが符号付き32ビット整数であることに気付きましたが、元のタイプは符号なし8ビット整数です。その場合、値を適切にスケーリングする必要があります ( scaleAddを見てください)。

最後に、画像チャンネルを破棄する前に、画像が YCbCr 形式であることを確認することをお勧めします。

于 2013-03-11T11:31:07.443 に答える