イメージ ファイルの読み取り、書き込み、クエリ
イメージ形式の処理
通常、グラフィックス ファイル形式のイメージは、MATLAB® 行列または通常の行列としても保存されていません。ほとんどのグラフィックス ファイルは、形式固有の情報タグを含んだヘッダーで始まり、連続したストリームとして読み取り可能なビットマップ データがその後ろに続きます。そのため、それらのグラフィックス ファイル形式のイメージを読み書きするために、標準の MATLAB I/O コマンド load や save を使うことができません。
MATLAB はグラフィックス ファイル形式からイメージ データを読み取ったり、書き込んだりする特別な関数を用意しています。
グラフィックス ファイル形式イメージを読み取るには、
imreadを使用します。グラフィックス ファイル形式イメージを書き込むには、
imwriteを使用します。グラフィックス ファイル形式イメージの性質に関する情報を得るには、
imfinfoを使用します。
次の表は、イメージ タイプ別に使用する MATLAB コマンドを示しています。
グラフィックス イメージの読み取り
関数 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 (トゥルーカラー)、強度 (グレースケール)、インデックス付き