8 ビットと 16 ビット イメージ
インデックス付きイメージ
倍精度 (64 ビット) の浮動小数点数は、MATLAB® の既定の数値データ表現です。しかし、イメージを取り扱うために必要なメモリ量を減らすため、数値クラス uint8
や uint16
を使って 8 ビットまたは 16 ビットの符号なし整数としてイメージを保存することができます。クラス uint8
のデータ行列のイメージは 8 ビット イメージと呼ばれ、クラス uint16
のデータ行列のイメージは 16 ビット イメージと呼ばれます。
関数 image
は、8 ビットまたは 16 ビット イメージを倍精度に変換しないで、直接表示することができます。しかし、image
はイメージ行列が uint8
または uint16
のとき、行列値の解釈が少し異なります。この特殊な解釈内容は、イメージ タイプに依存します。
X
のクラスが uint8
または uint16
の場合、その値は、カラーマップ インデックスとして使われる前に 1 だけオフセットされます。値 0 はカラーマップの 1 番目の行を、値 1 はカラーマップの 2 番目の行を、というように示されます。image
コマンドは、適切なオフセットを自動的に適用するため、X
が double
か、uint8
か、uint16
かに関係なく、表示方法は同じになります。
image(X); colormap(map);
uint8
および uint16
データに対するカラーマップ インデックスのオフセットは、標準のグラフィックス ファイル形式をサポートするためのものです。標準のグラフィックス ファイル形式では一般的に、イメージ データが 256 要素のカラーマップを使用したインデックス形式で保存されます。オフセットは、よりメモリ効率の良い uint8
や uint16
配列を使って、この型のイメージを取り扱い、表示させることができるようにするものです。
オフセットのために、uint8
や uint16
のインデックス イメージを double
に変換するため、1 を加えます。以下に例を示します。
X64 = double(X8) + 1; or X64 = double(X16) + 1;
逆に、double
インデックス付きイメージを uint8
や uint16
に変換するには、1 を引きます。
X8 = uint8(X64 - 1); or X16 = uint16(X64 - 1);
強度イメージ
double
イメージ配列の範囲は、通常 [0, 1] ですが、8 ビット強度イメージの範囲は、通常 [0, 255] の範囲で、16 ビット強度イメージの範囲は、通常 [0, 65535] です。グレースケール カラーマップをもつ 8 ビット強度イメージを表示するには、次のコマンドを使います。
imagesc(I,[0 255]); colormap(gray);
強度イメージを double
から uint16
に変換するには、まず 65535 を乗算します。
I16 = uint16(round(I64*65535));
逆の変換では、uint16
の強度イメージを double
に変換した後、65535 で除算します。
I64 = double(I16)/65535;
RGB イメージ
8 ビット RGB イメージの色要素は、[0, 1] の範囲の浮動小数点数ではなく、[0, 255] の範囲の整数です。色成分が (255,255,255) であるピクセルは、白として表示されます。image
コマンドは、そのクラスが double
か、uint8
か、uint16
であるかに関係なく、RGB イメージを正しく表示します。
image(RGB);
RGB イメージを double
から uint8
に変換するには、まず 255 を乗算します。
RGB8 = uint8(round(RGB64*255));
逆の変換では、uint8
の RGB イメージを double
に変換した後、255 で除算します。
RGB64 = double(RGB8)/255
RGB イメージを double
から uint16
に変換するには、まず 65535 を乗算します。
RGB16 = uint16(round(RGB64*65535));
逆の変換では、uint16
の RGB イメージを double
に変換した後、65535 で除算します。
RGB64 = double(RGB16)/65535;
uint8 と uint16 をサポートしている数学演算
次の MATLAB 関数を uint8
および uint16
データで使用する場合、最初にデータをタイプ double
に変換します。
たとえば、X
が uint8
イメージの場合、データを double
型にキャストします。
fft(double(X))
これらの関数では、出力は常に double
になります。
関数 sum
では結果が入力と同じデータ型で返されますが、オプションで、計算に倍精度を使用することもできます。
MATLAB 整数演算
数学関数を double でないデータ型と共に使用する方法の詳細は、整数クラスの算術演算 を参照してください。
Image Processing Toolbox™ で用意されているほとんどの関数は、uint8
や uint16
の入力を受け入れます。uin
t8 または uint16
のデータに高度なイメージ処理を適用する場合、ユーザーの MATLAB の計算環境にそのツールボックスを加えることを検討してください。
その他サポートしている 8 ビット、16 ビット配列
MATLAB は、uint8
や uint16
配列上で適用できる、以下のような演算をサポートしています。
8 ビット RGB イメージをグレースケールに変換
MATLAB を使うと、整数データに演算を実行できますが、イメージ データの数値クラスを最初に変更せずに、イメージ タイプを変更することができます。
この例では、8 ビット RGB イメージを MATLAB 変数に読み取り、グレースケール イメージに変換します。
rgb_img = imread('ngc6543a.jpg'); % Load the image image(rgb_img) % Display the RGB image axis image;
メモ
このイメージは、NASA 契約 NAs5-26555 による Association of Universities for Research in Astronomy, Inc. が運営している Space Telescope Science Institute の支援を受けて作成され、AURA/STScI の許可を得て複製したものです。AURA/STScI が作成したイメージのデジタル出力は、特許権使用料なしに入手できます。謝辞: J.P. Harrington と K.J. Orkowski (University of Maryland) および NASA。
NTSC 規格に基づいて、RGB 値を結合してモノクロ輝度を計算します。NTSC 規格は、RGB カラーに対する目の感度に関係した係数を適用します。
I = .2989*rgb_img(:,:,1)... +.5870*rgb_img(:,:,2)... +.1140*rgb_img(:,:,3);
I
は最小ゼロから最大 255 までの整数値をもつ強度イメージです。
min(I(:)) ans = 0
max(I(:)) ans = 255
イメージを表示するには、256 値のグレースケール カラーマップを使用します。これにより、サイズの違うカラーマップを使う場合に必要な、データから色へのマッピングのスケーリングを回避することができます。カラーマップが各データ値に対して 1 つの入力を含まない場合、関数 imagesc
を使用します。
これで、gray カラーマップを使って、新しい Figure にイメージを表示します。
figure; colormap(gray(256)); image(I); axis image;
関連情報
暗色から明色に連続的に色の範囲が変わるカラーマップは、使用できるイメージを作成します。たとえば、典型的なオシロスコープの形に対して colormap(summer(256))
を試してみます。他の選択肢については colormap
を参照してください。
brighten
を使うと、コンピューターの表示による違いを内挿したり、イメージの薄暗い、あるいは明るい領域の可視性を向上させるために、カラーマップのカラー強度を上げたり下げたり (反対のレンジは逆になります) をすることができます。
イメージ タイプと数値クラスのまとめ
次の表は、MATLAB がイメージ タイプとデータ クラスに従って、データ行列の要素をピクセルの色として解釈する方法をまとめたものです。
イメージ タイプ | double データ | uint8 または uint16 データ |
---|---|---|
インデックス付き | イメージは範囲 [1, p] の m 行 n 列の整数配列です。 カラーマップは、範囲 [0,1] の p 行 3 列の浮動小数点数値配列です。 | イメージは範囲 [0, p –1] の m 行 n 列の整数配列です。 カラーマップは、範囲 [0,1] の p 行 3 列の浮動小数点数値配列です。 |
強度 | イメージは、カラーマップ インデックスを作成するために、線形にスケーリングされる m 行 n 列の浮動小数点数値配列です。典型的な値の範囲は [0,1] です。 カラーマップは、範囲 [0,1] の p 行 3 列の浮動小数点値配列で、一般にはグレースケールです。 | イメージは、カラーマップ インデックスを作成するために、線形にスケーリングされる m 行 n 列の整数配列です。一般的な値の範囲は、[0, 255] または [0, 65535] です。 カラーマップは、範囲 [0,1] の p 行 3 列の浮動小数点値配列で、一般にはグレースケールです。 |
RGB (トゥルーカラー) | イメージは、範囲 [0,1] の m x n x 3 の浮動小数点数値配列です。 | イメージは、範囲 [0, 255] または [0, 65535] の m x n x 3 の整数配列です。 |