7

私のコードは RGB イメージを読み取り、それを処理して浮動小数点の結果を生成します。Matlab 7.6.0 (R2008a) で、これらの浮動小数点値を維持しながら、これらの値を画像として書き込むにはどうすればよいですか?

4

6 に答える 6

1

デジタル画像の各要素を表すために使用されるビット数は、画像のビット深度と呼ばれます。ビット深度は、画像の要素が取ることができる離散レベルの数を教えてくれます。これらの要素が整数型または浮動小数点型として格納されるかどうかは関係ありません。ビット深度によって、離散レベルがいくつあるかが正確に決まります。

ビット深度の解釈方法は、画像がグレースケールかカラーかによって異なります。たとえば、8 ビット グレースケール イメージの強度は [0,255] ですが、24 ビット カラー イメージの強度[0,255] です。この命名法が使用されるのは、8 ビットの赤、緑、青のコンポーネントを含むカラー ピクセルを格納するには 24 ビットが必要だからです。混乱を避けるために、カラー画像は多くの場合、カラー チャネルあたりのビット数によって呼び出されます。たとえば、PNG 形式は、チャネルごとに最大 16 ビット、またはアルファ レイヤーを使用したトゥルーカラー (RGB) で合計 48 ビットをサポートします。

imwriteのドキュメンテーションには、MATLAB で使用できる形式とビット深度が一覧表示されています。

最高レベルの精度で MATLAB からカラー イメージ (MxNx3 行列) を保存します。

%// Assume an image called 'im' of type double.
%// First normalize to fall into [0,1].
im = im - min(im(:)); %// Save these numbers somewhere
im = im / max(im(:)); %// if you need to recover the original values later!
%// Best PNG quality.
imwrite(im,'image.png','bitdepth',16);

さらに精度が必要な場合は、特殊な画像形式ではなく、一般的なデータ形式で画像を保存する必要があります。

于 2012-12-23T12:45:06.697 に答える
1

浮動小数点値を持つ画像は、tiff 画像形式で書き込むことができます。次に例を示します。

A=single(7.6*rand(10,10))

t = Tiff('test.tif', 'w'); 
tagstruct.ImageLength = size(A, 1); 
tagstruct.ImageWidth = size(A, 2); 
tagstruct.Compression = Tiff.Compression.None; 
tagstruct.SampleFormat = Tiff.SampleFormat.IEEEFP; 
tagstruct.Photometric = Tiff.Photometric.MinIsBlack; 
tagstruct.BitsPerSample = 32; 
tagstruct.SamplesPerPixel = 1; 
tagstruct.PlanarConfiguration = Tiff.PlanarConfiguration.Chunky; 
t.setTag(tagstruct); 
t.write(A); 
t.close();

B=imread('test.tif')
于 2013-06-28T13:56:56.347 に答える
1

次の関数は、単精度のグレースケールまたは RGB イメージを tif ファイルに書き込みます。最近では、ピクセル値が (0,1) の範囲内にある場合、Windows エクスプローラーは単精度画像を非常にうまく処理できることがわかります。読み返すとimread通常通り使えます。

function writeftif(outim,outfilename)
t = Tiff(outfilename,'w');
if size(outim,3)==3
    t.setTag('Photometric',Tiff.Photometric.RGB);
elseif size(outim,3)==1
    t.setTag('Photometric',Tiff.Photometric.MinIsBlack);
end
t.setTag('Compression',Tiff.Compression.None);
t.setTag('BitsPerSample',32);
t.setTag('SamplesPerPixel',size(outim,3));
t.setTag('SampleFormat',Tiff.SampleFormat.IEEEFP);
t.setTag('ImageLength',size(outim,1));
t.setTag('ImageWidth',size(outim,2));
t.setTag('PlanarConfiguration',Tiff.PlanarConfiguration.Chunky);
% Write the data to the Tiff object.
t.write(single(outim));
t.close();
于 2015-10-26T19:22:59.360 に答える
0

RGB値が(0,1)の範囲外の場合は、RGB値を0から1の間で変換するだけです。元のfloat値を復元する場合は、変換値を画像ファイル名の一部として保存できます。

于 2012-12-22T14:19:21.420 に答える
0

画像を保存するとき、閲覧者は可能な値の全範囲を知る必要があります。一般的な規則は、値が float、範囲が [0..1]、値が uint8 の場合、範囲が [0..255] などです。

2.34 のような float 値で画像を保存する場合、視聴者がそれをどのように解釈するかを自問する必要があります。

私の答えは次のとおりです。値を有効な範囲に変換してから保存する必要があります。たとえば、float 範囲が [0..10] の場合、すべての値に 1000 を掛けて uint16 として保存できます。そうすれば、float 値の精度を (ほぼ) 維持できます。

于 2012-12-23T08:42:36.210 に答える