3

matlabim2double関数の一貫性のない動作を説明できますか?
基本的に、この関数は入力としてintの行列Aを与えられ、0 ...1の範囲の値を正規化します。

例:

I1 = reshape(uint8(linspace(1,255,9)),[3 3])
I2 = im2double(I1)

I1 =

    1   96  192
   33  128  223
   65  160  255


I2 =

    0.0039    0.3765    0.7529
    0.1294    0.5020    0.8745
    0.2549    0.6275    1.0000

しかし今、私がdoubleの行列を提供する場合:

I1 =

    0.1000    0.2000
    1.5000    2.2000

の結果im2doubleは同じ行列I1です(したがって、正規化は行われません)。この一貫性のない動作を理解できますか?

4

2 に答える 2

4

タイプhelp im2double。最初の数行は

IM2DOUBLEは入力として画像を受け取り、クラスdoubleの画像を返します。入力画像がdoubleクラスの場合、出力画像はそれと同じです。入力画像がdoubleでない場合、IM2DOUBLEはクラスdoubleと同等の画像を返し、必要に応じてデータを再スケーリングまたはオフセットします。

したがって、動作は意図されています。実際、im2double.mエディターで開くと、次のように表示されます。

function d = im2double(img, typestr)
...
if isa(img, 'double')
    d = img;
...

end

それが直感的であるかどうか、まあ、それは議論の余地があります:)

とにかく、この動作には正当な理由があります。タイプの入力を使用するとint8、天井が何であるかがわかります(255)。その情報を使用して、出力を再スケーリングできます(values/255)。int16(values/65535)なども同様です。

ただし、が与えられるとdouble、現実的な上限はなくなります。ほとんどのdouble値でvalues/realmax << realminは、、、したがって、再スケーリングにはほとんど意味がありません。

25516ビットデータを対象としている場合は、追加の引数などを指定する必要があるという警告とともに、これをスケーリングするのに適したデフォルトであると主張することができます。しかし、まあ...それは醜くなり、機能を不必要に複雑にします。私は、そのようなイベントでオリジナルを保持するというMathworksの決定を理解できます。

于 2013-01-21T15:51:16.687 に答える
4

画像処理ツールボックスは、画像の2つの異なる表現をサポートしています。画像は整数RGB値(通常は8ビット0..255値)として保存できます。または、0..1の範囲の実数として格納される場合があります。

im2double画像を実際の配列として扱い、さまざまな数学演算を実行する場合に備えて、2番目のタイプの表現があることを確認します。

したがって、画像がすでにタイプdoubleである場合、その値は0..1の範囲にあり、何もする必要はありません。そうでない場合、関数は入力を実数に変換し、1/255を掛けて再スケーリングします。

于 2013-01-21T18:03:11.373 に答える