37

imshow関数を使用してCV_32Fタイプの画像を表示しようとしましたが、WHITE画像が表示されました。ドキュメントでは、浮動小数点画像が0〜255にマッピングされて表示されるとされていますが、白い画像しか表示されませんでした。

マットA=マット::ones(300,300、CV_32FC1)* 1000;

いくつかの処理を行います-Aのピクセルにfloat値を割り当てます

.....。

マットB;

A.convertTo(B、CV_8U)

'B'を表示すると、白黒の画像が表示されますが、グレーの色合いはありません。Aのfloat値のピクセルは0〜255に適切にマッピングされていますか?私は何か間違ったことをしていますか?

Aのいくつかの値は初期化されたときに1000であり、残りは処理中に割り当てられるいくつかの浮動小数点数です。

4

1 に答える 1

64

OpenCVでは、画像が浮動小数点タイプのimshow場合、0.0から1.0までの値を持つそれらのピクセルのみを視覚化できます。値が1.0より大きい場合は白いピクセルとして表示され、0.0未満の場合は表示されます。 、黒いピクセルとして表示されます。浮動小数点画像を視覚化するには、その値を範囲にスケーリングします0.0 - 1.0

変換部分については...デフォルトの引数で使用すると、cv::Mat::convertTo関数は指定された型の行列を作成し、ソース行列から値をコピーして、宛先データ型の可能な限り最も近い値に丸めます。値が範囲外の場合、最小値または最大値にクランプされます。

のドキュメントにはimshow、次のように書かれています。

画像が32ビット浮動小数点の場合、ピクセル値は255で乗算されます。つまり、値の範囲[0,1]は[0,255]にマップされます。

これは、0.0から1.0の範囲の値のみが0から255にマップされることを意味します。値が1.0より大きく、255を掛けると、255より大きくなります。次に、との範囲にクランプされますCV_8U。最終的には255にもなります。

この例では、1000であるすべての値は、宛先タイプと同じように宛先マトリックスで255になり、CV_8U可能な最大値は255です。すべての浮動小数点値がfloor編集されます。自動マッピングは行われません。

CV_8U値を関数の3番目と4番目のパラメーターの使用範囲に適切にマップしcv::Mat::convertTo、変換が行われる前に値がスケーリングされるようにします。

行列Aに最小値と最大値Min、およびがあります。Maxここで、Min!=Max

値を0から255まで適切にスケーリングするには、次のようにします。

if (Min!=Max){ 
    A -= Min;
    A.convertTo(B,CV_8U,255.0/(Max-Min));
}

次のように直接これを行うこともできます。

if (Min!=Max)
    A.convertTo(B,CV_8U,255.0/(Max-Min),-255.0*Min/(Max-Min));

(zhangxaochenのコメントを考慮して編集)

于 2013-01-26T17:39:52.147 に答える