メインコンテンツ

8 ビットと 16 ビット イメージ

R2026b

インデックス付きイメージ

倍精度 (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 の入力を受け入れます。uint8 または uint16 のデータに高度なイメージ処理を適用する場合、ユーザーの MATLAB の計算環境にそのツールボックスを加えることを検討してください。

その他サポートしている 8 ビット、16 ビット配列

MATLAB は、uint8 や uint16 配列上で適用できる、以下のような演算をサポートしています。

  • 関数 reshape、cat、permute、[]、' 演算子を使った配列の整形、並べ替え、連結をします。

  • save や load を使って、uint8 や uint16 配列を MAT ファイルに保存したり、読み込みます(グラフィックス ファイル形式イメージを読み込んだり、保存するには、imread や imwrite を使ってください)。

  • 関数 find を使って、uint8 や uint16 配列の非ゼロの要素の位置のインデックスを検索します。しかし、出力される配列は常にクラスが double になります。

  • 関係演算子

8 ビット RGB イメージをグレースケールに変換

MATLAB を使うと、整数データに演算を実行できますが、イメージ データの数値クラスを最初に変更せずに、イメージ タイプを変更することができます。

この例では、8 ビット RGB イメージを MATLAB 変数に読み取り、グレースケール イメージに変換します。

rgb_img = imread('ngc6543a.jpg'); % Load the image
image(rgb_img) % Display the RGB image

axis image;

Color image displayed in axes

メモ

このイメージは、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 は最小ゼロから

min(I(:))
ans =
	0

最大 255 までの整数値をもつ強度イメージです。

max(I(:))
ans = 
	255

イメージを表示するには、256 値のグレースケール カラーマップを使用します。これにより、サイズの違うカラーマップを使う場合に必要な、データから色へのマッピングのスケーリングを回避することができます。カラーマップが各データ値に対して 1 つの入力を含まない場合、関数 imagesc を使用します。

これで、gray カラーマップを使って、新しい Figure にイメージを表示します。

figure; colormap(gray(256)); image(I);
axis image;

Color image displayed using a grayscale colormap appears gray

関連情報

暗色から明色に連続的に色の範囲が変わるカラーマップは、使用できるイメージを作成します。たとえば、典型的なオシロスコープの形に対して 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 の整数配列です。