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のコメントを考慮して編集)