Main Content

イメージ ファイルの読み取り、書き込み、クエリ

イメージ形式の処理

通常、グラフィックス ファイル形式のイメージは、MATLAB® 行列または通常の行列としても保存されていません。ほとんどのグラフィックス ファイルは、形式固有の情報タグを含んだヘッダーで始まり、連続したストリームとして読み取り可能なビットマップ データがその後ろに続きます。そのため、それらのグラフィックス ファイル形式のイメージを読み書きするために、標準の MATLAB I/O コマンド loadsave を使うことができません。

MATLAB はグラフィックス ファイル形式からイメージ データを読み取ったり、書き込んだりする特別な関数を用意しています。

  • グラフィックス ファイル形式イメージを読み取るには、imread を使用します。

  • グラフィックス ファイル形式イメージを書き込むには、imwrite を使用します。

  • グラフィックス ファイル形式イメージの性質に関する情報を得るには、imfinfo を使用します。

次の表は、イメージ タイプ別に使用する MATLAB コマンドを示しています。

手順

使用する関数

行列を MAT ファイルとして読み込んだり、保存します。

load

save

グラフィックス ファイル形式のイメージ (たとえば BMP や TIFF) として読み込んだり、保存します。

imread

imwrite

MATLAB ワークスペースに読み込まれた任意のイメージを表示します。

image

imagesc

ユーティリティ

imfinfo

ind2rgb

グラフィックス イメージの読み取り

関数 imread は、サポートしているビット深度のいずれかで、サポートしているグラフィックス イメージ ファイルからイメージを読み取ります。読み取る大部分のイメージは、8 ビットです。これらがメモリに読み取られると、MATLAB は、uint8 クラスとして保存します。この法則に当てはまらないものは、MATLABによる PNG と TIFF イメージ用の 16 ビットへの対応です。これらを読み取ると、クラス uint16 として保存されます。

メモ

インデックス付きイメージの場合、関数 imread では、イメージ配列自体のクラスが uint8 または uint16 であっても、カラーマップが常にクラス double の配列に読み取られます。

次のコマンドは、ワークスペース変数 RGB にイメージ ngc6543a.jpg を読み取り、関数 image を使用してイメージを表示します。

RGB = imread('ngc6543a.jpg');
image(RGB)

また、imwrite 関数を使って、イメージ データを書き込む (保存する) ことができます。以下のステートメントを見てみましょう。

load clown % An image that is included with MATLAB
imwrite(X,map,'clown.bmp')

は、道化師のイメージを含む BMP ファイルを作成します。

グラフィカル イメージの書き込み

imwrite を使用してイメージを保存すると、既定では、ビット深度が自動的に uint8 に抑えられます。MATLAB で使われる多くのイメージは 8 ビットで、ほとんどのグラフィックス ファイル形式イメージは倍精度データであることを必要としません。イメージ データが uint8 として保存されるというこのルールには、例外があります。たとえば、PNG イメージや TIFF イメージは uint16 として保存することができます。これら 2 つの形式は、16 ビットデータをサポートしているので、imwrite に対するデータ型として uint16 を指定することで、MATLAB の既定の処理をオーバーライドすることができます。次の例は、imwrite を使って、16 ビットの PNG ファイルを書き込みます。

imwrite(I,'clown.png','BitDepth',16);

グラフィックス イメージのサブセット化 (トリミング)

イメージ ファイルの一部分のみを処理したり、サブセクションに分割したい場合があります。処理する四角形のサブセクション固有の座標を指定し、コマンド ラインからファイルに保存します。サブセクションの隅の座標がわからない場合は、次の例に示すように対話的に選択します。

% Read RGB image from graphics file. 
im = imread('street2.jpg'); 

% Display image with true aspect ratio
image(im); axis image

% Use ginput to select corner points of a rectangular
% region by pointing and clicking the mouse twice
p = ginput(2); 

% Get the x and y corner coordinates as integers
sp(1) = min(floor(p(1)), floor(p(2))); %xmin
sp(2) = min(floor(p(3)), floor(p(4))); %ymin
sp(3) = max(ceil(p(1)), ceil(p(2)));   %xmax
sp(4) = max(ceil(p(3)), ceil(p(4)));   %ymax

% Index into the original image to create the new image
MM = im(sp(2):sp(4), sp(1): sp(3),:);

% Display the subsetted image with appropriate axis ratio
figure; image(MM); axis image

% Write image to graphics file. 
imwrite(MM,'street2_cropped.tif') 

イメージの隅の座標がわかっている場合は、上記の例で ginput を利用しないで sp を手動で定義できます。

サブセット化するイメージを操作して MATLAB の表示を "ラバー バンド ボックス" にすることも可能です。詳細については、rbbox の例を参照してください。さらに詳しくは、関数 ginput および image のドキュメンテーションを参照してください。

グラフィックス ファイルに関する情報の取得

関数 imfinfo を用いると、前述した標準形式のグラフィックス ファイルに関する情報を得ることができます。ユーザーが得る情報は、ファイルのタイプに依存しますが、少なくとも、次の情報は常に含んでいます。

  • ファイルが現在のフォルダーにない場合、フォルダー パスを含むファイル名

  • ファイル形式

  • ファイル形式のバージョン番号

  • ファイル更新日

  • ファイルサイズ (バイト単位)

  • イメージ幅 (ピクセル単位)

  • イメージ高 (ピクセル単位)

  • ピクセルあたりのビット数

  • イメージ タイプ: RGB (トゥルーカラー)、強度 (グレースケール)、インデックス付き