2013-01-26 6 views
22

imshow関数を使用してCV_32Fタイプの画像を表示しようとしましたが、の白色画像を示しました。 Documentationにその浮動小数点画像は0~255にマッピングされ、表示されることを考えると、それはちょうど白image.IがMatオブジェクトのタイプをCV_32FからCV_8Uに変更

マットA =マット::もの(300300使用CV_8Uに変換する試みを示し、 CV_32FC1)* 1000;

行う何らかの処理 - ......

の画素に浮動小数点値を割り当てる

マットB。

A.convertTo(B、CV_8U)

Iが 'B' を関数imshow iが黒&白画像を取得し、グレーのない色合いが存在しません。 Aの浮動小数点値のピクセルは0-255に正しくマップされていますか?私は間違って何かしていますか?

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

答えて

43

OpenCVでは、画像が浮動小数点型である場合、値が1.0より大きい場合は、imshowを使用してそのピクセルのみを視覚化できます。値が1.0より大きい場合は、白いピクセルとして表示されます0.0未満の場合は黒のピクセルとして表示されます。 浮動小数点画像を視覚化するには、値を0.0 - 1.0にスケールします。

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

、それことが書かれている:、画像は32ビット浮動小数点の場合、画素値は、値の範囲[0と255によって を乗算さ

1]は[0,255]にマッピングされる。

これは、0.0〜1.0の範囲の値のみが0〜255にマップされることを意味します。値が1.0より大きく、255を掛けた場合、255より大きくなります。 CV_8Uの範囲にクランプされ、最終的には255になります。最終的には255になります。と最大255の値が宛先マトリックスとして255になります。すべての浮動小数点値はfloorになります。自動マッピングは行われません。

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

Aの行列の最小値と最大値がMinMaxであるとします(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さんのコメントを考慮して、編集)

+0

ありがとうsgar91、私はちょうど最小値が2.3221であり、最大値が1000であることを発見しました。この範囲を0-255にどのようにマップするのですか?私はconvertToの第3および第4パラメータに何を使用すべきですか? –

+1

@KarthikMurugan ...更新された回答を確認してください。 – sgarizvi

+5

'beta'フィールドは' -255.0/Min'の代わりに '-255.0 * Min /(Max-Min)'でなければなりません。 – zhangxaochen