イメージ ファイルの読み取り、書き込み、クエリ
イメージ形式の処理
通常、グラフィックス ファイル形式のイメージは、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 (トゥルーカラー)、強度 (グレースケール)、インデックス付き