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