初心者向けMATLAB imwrite
ガイド:画像をファイルに保存する方法
画像処理の世界へようこそ!MATLABは強力な数値計算およびプログラミング環境ですが、画像処理においても非常に優れた機能を提供します。画像を読み込んだり、編集したり、解析したりするだけでなく、その結果をファイルとして保存することも頻繁に行われます。この「保存する」という操作の中心となるのが、今回ご紹介する imwrite
関数です。
この記事は、MATLABでの画像処理が初めての方、特に画像をファイルとして適切に保存する方法を学びたい初心者の方を対象としています。imwrite
関数の基本的な使い方から、様々な画像形式に対応した応用的な使い方、そしてよくある問題とその解決策まで、画像をファイルに保存するために必要な知識を体系的に、そして分かりやすく解説していきます。
さあ、MATLABを使って、あなたの素晴らしい画像処理の結果をファイルとして保存し、共有する準備をしましょう!
1. はじめに:なぜ画像の保存が重要なのか
MATLABで画像処理を行う際、入力となる画像はファイルから読み込むことが多いでしょう (imread
関数などを使用します)。画像を読み込んだ後、様々な処理を施します。例えば、ノイズを除去したり、明るさを調整したり、特定の特徴を抽出したり、画像を合成したりといった処理です。
これらの処理の結果は、通常、MATLABのワークスペース上の変数(多くは行列)として保持されます。しかし、ワークスペース上のデータは、MATLABを終了すれば失われてしまいます。また、処理結果を他のソフトウェアで開いたり、他の人に送ったりするためには、ファイルとして保存する必要があります。
ここで登場するのが imwrite
関数です。imwrite
は、MATLABのワークスペース上にある画像データを、指定したファイル形式で、指定したファイル名で、ディスク上に保存するための関数です。
適切に画像を保存する方法を知ることは、画像処理のワークフローにおいて非常に重要です。処理結果を残す、他のツールと連携する、ウェブサイトに掲載する、研究論文に画像を掲載するなど、様々な場面で必要となります。
この記事では、この imwrite
関数に焦点を当て、初心者の方が自信を持って画像を保存できるようになることを目指します。
2. MATLABにおける画像の表現を理解する
imwrite
関数を効果的に使うためには、MATLABが画像をどのように内部で扱っているかを理解しておくことが役立ちます。MATLABでは、画像は数値の「行列」として表現されます。この行列の各要素が、画像における「画素」(ピクセル)の色や明るさの情報を持っています。
画像の表現方法にはいくつか種類があります。
- Intensity Image (輝度画像): グレースケール画像とも呼ばれます。各画素の明るさ(輝度)を表す単一の数値を持つ行列として表現されます。白黒写真やレントゲン画像のようなものがこれにあたります。行列のサイズは
M x N
となります(M行、N列)。 - RGB Image (RGB画像): カラー画像です。各画素の色を、赤 (Red)、緑 (Green)、青 (Blue) の3つの要素の組み合わせで表現します。MATLABでは、この3つの要素がそれぞれ別の行列、あるいは3次元の行列として表現されます。通常は
M x N x 3
のサイズの3次元行列として扱われます。A(i, j, 1)
が(i,j)
画素の赤の成分、A(i, j, 2)
が緑の成分、A(i, j, 3)
が青の成分を表します。 - Binary Image (二値画像): 各画素が0か1の値を持つ画像です。通常、0は黒(または背景)、1は白(または前景)を表します。白黒画像よりもさらに単純で、オブジェクトの存在を示すためなどに使われます。行列のサイズは
M x N
となります。論理型 (logical
) として表現されることが多いです。 - Indexed Image (インデックスカラー画像): 画像データ自体は
M x N
の行列ですが、この行列の各要素の値は、別途定義された「カラーマップ」(colormap)というリストの「インデックス」(位置)を指します。カラーマップは、それぞれのインデックスに対応するRGBカラーの情報を保持しています。インデックスカラー画像は、使用できる色の種類が限られますが、ファイルサイズを小さく抑えることができる場合があります(特にGIF画像などで使われます)。MATLABでは、画像データを行列X
、カラーマップを行列map
として扱います。map
はK x 3
のサイズの行列で、Kは使用できる色の数、各行はRGB値 ([R G B]) を表します。
これらの画像データは、MATLABの変数としては様々なデータ型 (uint8
, uint16
, double
, single
, logical
など) で保持されます。
uint8
: 符号なし8ビット整数。0から255までの値を扱えます。多くの画像ファイル形式(JPEG, PNG, BMPなど)の標準的なデータ型です。8ビットグレースケール画像なら0(黒)〜255(白)、24ビットRGB画像なら各色チャンネルが0〜255の値を持ちます。uint16
: 符号なし16ビット整数。0から65535までの値を扱えます。より広い輝度範囲を表現できるため、医療画像や科学画像などで使われます。double
/single
: 倍精度浮動小数点数 / 単精度浮動小数点数。通常、画素値は0から1の範囲に正規化して表現されます。例えば、0は黒、1は白を表します。画像処理の中間計算などでよく使われます。
imwrite
関数は、これらの様々な画像表現(Intensity, RGB, Binary, Indexed)とデータ型に対応しています。imwrite
は、入力された画像データ (A
や X
, map
) の構造やデータ型を見て、適切なファイル形式で保存しようとします。必要に応じて、データ型や値の範囲を自動的に変換してくれることもありますが、意図した結果を得るためには、入力データの形式を意識することが重要です。
3. imwrite
関数の基本
imwrite
関数の最も基本的な使い方は非常にシンプルです。
matlab
imwrite(A, filename)
この構文の意味するところは:
A
: 保存したい画像データを含むMATLABの変数(行列)です。これはIntensity Image (グレースケール)、RGB Image (カラー)、またはBinary Image (二値画像) のデータであると想定されます。filename
: 画像を保存するファイル名を指定する文字列です。ファイル名には、ファイル形式を示す拡張子を含める必要があります(例:'myimage.jpg'
,'result.png'
)。imwrite
関数は、指定された拡張子を見て、どのファイル形式で保存するかを判断します。
例1: グレースケール画像の保存
まず、MATLABに組み込まれているサンプル画像データを使って、グレースケール画像を生成し、保存してみましょう。
“`matlab
% サンプル画像の読み込み (グレースケール画像)
I = imread(‘cameraman.tif’);
% 画像を表示 (確認用)
figure;
imshow(I);
title(‘元のグレースケール画像’);
% 画像をファイルに保存
% ファイル名は ‘cameraman_saved.png’ とし、PNG形式で保存します。
filename = ‘cameraman_saved.png’;
imwrite(I, filename);
% 保存できたか確認 (任意)
% 保存したファイルを再度読み込んで表示してみる
I_saved = imread(filename);
figure;
imshow(I_saved);
title([‘保存された画像: ‘, filename]);
“`
このコードを実行すると、MATLABのカレントフォルダ、またはパスが通っている場所に 'cameraman_saved.png'
というファイルが作成されます。このファイルはPNG形式のグレースケール画像です。
例2: カラー画像の保存
次に、カラー画像を保存してみましょう。MATLABにはカラー画像のサンプルも含まれています。
“`matlab
% サンプル画像の読み込み (カラー画像)
RGB = imread(‘peppers.png’);
% 画像を表示 (確認用)
figure;
imshow(RGB);
title(‘元のカラー画像’);
% 画像をファイルに保存
% ファイル名は ‘peppers_saved.jpg’ とし、JPEG形式で保存します。
filename = ‘peppers_saved.jpg’;
imwrite(RGB, filename);
% 保存できたか確認 (任意)
% 保存したファイルを再度読み込んで表示してみる
RGB_saved = imread(filename);
figure;
imshow(RGB_saved);
title([‘保存された画像: ‘, filename]);
“`
このコードを実行すると、'peppers_saved.jpg'
というファイルが作成されます。これはJPEG形式のカラー画像です。
ファイル名の指定方法
filename
には、単純なファイル名だけでなく、パスを含めて指定することもできます。
- 現在のフォルダに保存:
'myimage.png'
- 特定のフォルダに保存:
'C:\Users\YourName\Documents\images\myimage.jpg'
(Windowsの場合) - 相対パスで保存:
'../results/myimage.tif'
(現在のフォルダから一つ上の階層のresults
フォルダに保存)
パスを指定する際は、オペレーティングシステムに応じた区切り文字(Windowsでは \
または /
、macOS/Linuxでは /
)を使用します。MATLABでは \
と /
の両方をWindowsでも使うことができます。
サポートされているファイル形式
imwrite
関数は、MATLABがインストールされているシステムでサポートされている様々な画像ファイル形式での保存に対応しています。主な形式には以下のようなものがあります。
- JPEG (
.jpg
,.jpeg
) - PNG (
.png
) - TIFF (
.tif
,.tiff
) - GIF (
.gif
) - BMP (
.bmp
) - HDF4 (
.hdf
,.hdf4
) - HDF5 (
.h5
,.hdf5
) - ICO (
.ico
) - CUR (
.cur
) - PCX (
.pcx
) - XWD (
.xwd
) - وغيرها多数…
どの形式がサポートされているかは、MATLABのバージョンやインストールされているツールボックス、オペレーティングシステムによって異なる場合があります。サポートされている形式のリストは、imformats
関数を使って確認できます。
matlab
imformats
このコマンドを実行すると、MATLABがサポートしている全ての画像ファイル形式、それらの読み込み (read
関数)、書き出し (write
関数)、情報取得 (info
関数) に対応しているかどうかが表示されます。write
列に 'Yes'
と表示されている形式が、imwrite
関数で保存可能な形式です。
基本的な imwrite(A, filename)
の使い方は非常に簡単ですが、画像の形式や目的に応じて、様々なオプションを指定することができます。次に、主要な画像形式ごとに、imwrite
関数を使った保存方法と、それぞれの形式で利用できる便利なオプションについて詳しく見ていきましょう。
4. 様々な画像形式での保存とオプション
imwrite
関数は、ファイル名の拡張子を見て自動的にファイル形式を判断しますが、形式によっては追加のオプションを指定することで、保存の仕方や画質などを細かく制御できます。主な画像形式について、その特徴と imwrite
での指定方法、利用できるオプションを詳しく解説します。
4.1 JPEG形式 (.jpg, .jpeg)
特徴:
- 高い圧縮率: ファイルサイズを小さく抑えるのに非常に優れています。
- 非可逆圧縮: 圧縮・展開の過程で元の画像情報の一部が失われます。つまり、何度も保存を繰り返すと画質が劣化します。
- Webでの利用: ウェブサイトで最も一般的に使用される画像形式の一つです。
- カラー画像、グレースケール画像の保存に適しています。透明度(アルファチャンネル)はサポートしません。
imwrite
での指定:
ファイル名の拡張子を .jpg
または .jpeg
とします。
matlab
imwrite(RGB, 'output.jpg'); % RGB画像をJPEG形式で保存
imwrite(I, 'gray_output.jpg'); % グレースケール画像をJPEG形式で保存
主要なオプション: 圧縮品質 ('Quality'
)
JPEG形式で保存する際に最もよく使われるオプションは、圧縮の品質を指定する 'Quality'
です。品質は0から100までの整数値で指定します。
'Quality', 100
: 最高品質(最も圧縮率が低い、ファイルサイズが大きい、画質劣化が少ない)'Quality', 0
: 最低品質(最も圧縮率が高い、ファイルサイズが小さい、画質劣化が大きい)- デフォルト値は通常75です。
“`matlab
% 高品質で保存
imwrite(RGB, ‘peppers_high_quality.jpg’, ‘Quality’, 95);
% 低品質で保存
imwrite(RGB, ‘peppers_low_quality.jpg’, ‘Quality’, 10);
% デフォルト品質で保存 (Qualityオプションなしと同じ)
imwrite(RGB, ‘peppers_default_quality.jpg’, ‘Quality’, 75);
% または imwrite(RGB, ‘peppers_default_quality.jpg’);
“`
品質を変えて保存した複数の画像を開いて比較すると、画質とファイルサイズのトレードオフがよくわかります。品質を下げるほど、特に色の変化が少ない部分などにブロックノイズのようなものが見えやすくなります。
グレースケール画像のJPEG保存:
グレースケール画像を行列 I
で持っている場合も、同様にJPEGで保存できます。
“`matlab
% グレースケール画像を生成
I = imread(‘cameraman.tif’);
% グレースケール画像をJPEG形式で保存
imwrite(I, ‘cameraman_gray_jpeg.jpg’);
% 品質を指定して保存
imwrite(I, ‘cameraman_gray_jpeg_lowq.jpg’, ‘Quality’, 20);
“`
JPEG形式は、写真のように滑らかな色変化を持つ画像に適しています。イラストやロゴのように、色がはっきり分かれた画像や、透過情報が必要な画像には適していません。
4.2 PNG形式 (.png)
特徴:
- 可逆圧縮: 圧縮・展開しても元の画像情報が完全に保たれます。画質の劣化がありません。
- 透過情報(アルファチャンネル)をサポート: 画像の一部を透明にすることができます。
- Webでの利用: JPEGと並んで広く使われています。透過が必要な画像や、ロゴ、イラストなどに適しています。
- カラー画像、グレースケール画像、インデックスカラー画像の保存に対応します。
- 様々なビット深度をサポート(1ビットから64ビットまで)。
imwrite
での指定:
ファイル名の拡張子を .png
とします。
matlab
imwrite(RGB, 'output.png'); % RGB画像をPNG形式で保存
imwrite(I, 'gray_output.png'); % グレースケール画像をPNG形式で保存
透過情報(アルファチャンネル)の保存 ('Alpha'
)
PNGの大きな特徴の一つはアルファチャンネルをサポートしていることです。アルファチャンネルは、各画素の不透明度(または透明度)を指定する情報です。0(完全に透明)から1(完全に不透明)または0から255(uint8
の場合)の値で指定します。
アルファチャンネル付き画像を imwrite
で保存するには、画像データ本体 (A
) とは別に、アルファチャンネルのデータを含む行列を 'Alpha'
オプションで指定します。アルファチャンネルの行列は、画像データ本体と同じ高さと幅を持ち、要素数は1つ(グレースケール)または3つ(RGB)です。通常は1つの行列 (M x N
) です。
例:カラー画像 RGB
に対してアルファチャンネル Alpha
を指定して保存する。
“`matlab
% サンプルカラー画像の読み込み
RGB = imread(‘peppers.png’);
% サンプルアルファチャンネルの生成 (ここでは例として、画像の中央を透明にするマスクを作成)
alpha_channel = ones(size(RGB, 1), size(RGB, 2), ‘uint8’) * 255; % 最初は全て不透明(255)
% 画像サイズを取得
[height, width, ~] = size(RGB);
% 中央部分を透明にする (例えば、中央から100×100ピクセルの範囲を透明度50%にする)
center_row = round(height/2);
center_col = round(width/2);
box_size = 50; % 中心から±50ピクセル
row_start = max(1, center_row – box_size);
row_end = min(height, center_row + box_size – 1);
col_start = max(1, center_col – box_size);
col_end = min(width, center_col + box_size – 1);
alpha_channel(row_start:row_end, col_start:col_end) = 255 * 0.5; % 不透明度50% (値128程度)
% アルファチャンネル付きでPNG保存
imwrite(RGB, ‘peppers_with_alpha.png’, ‘Alpha’, alpha_channel);
% 保存した画像を読み込んで表示してみる (透過部分は環境によって表示が異なる場合があります)
% RGB_saved = imread(‘peppers_with_alpha.png’);
% figure;
% imshow(RGB_saved); % アルファチャンネルはimshowでは直接表示されないことが多い
% title(‘保存された画像 (透過情報付き)’);
“`
アルファチャンネルは、画像処理ソフトウェアなどでPNGファイルを開くと確認できます。この例では簡単なアルファチャンネルを生成しましたが、実際のアプリケーションでは、画像処理の結果として得られたマスクや、元の画像の透過情報(imread
で読み込んだ際に3つ目の出力として得られる場合がある)を使用します。
ビット深度の指定 ('BitDepth'
)
PNG形式は、画素値を表現するためのビット数を細かく指定できます。例えば、グレースケール画像であれば1, 2, 4, 8, 16ビット、RGB画像であれば8, 16ビット(各チャンネルあたり)などを指定できます。
“`matlab
% グレースケール画像を16ビットで保存 (データ型がuint16である必要がある)
I16 = imread(‘cameraman.tif’); % cameraman.tif は通常 uint8
% 例として uint16 に変換 (実際には元から16ビットの画像データを使うことが多い)
I16 = im2uint16(I16);
imwrite(I16, ‘cameraman_16bit.png’, ‘BitDepth’, 16);
% RGB画像を16ビット/チャンネルで保存 (データ型がuint16である必要がある)
RGB16 = imread(‘peppers.png’); % peppers.png は通常 uint8
RGB16 = im2uint16(RGB16);
imwrite(RGB16, ‘peppers_48bit.png’, ‘BitDepth’, 16); % 3チャンネルx16ビット = 48ビットカラー
“`
高いビット深度で保存すると、より細かい階調(色や明るさの変化)を表現できますが、ファイルサイズは大きくなります。通常、写真やWeb画像では8ビット(24ビットカラー)で十分ですが、医療画像や科学画像など、より広いダイナミックレンジや細かい階調が必要な場合には16ビット深度が使われることがあります。
インデックスカラー画像の保存:
PNG形式はインデックスカラー画像もサポートしています。インデックスカラー画像を保存するには、画像データ行列 (X
) とカラーマップ行列 (map
) を両方 imwrite
に渡します。
“`matlab
% RGB画像を読み込み、インデックスカラーに変換 (例として)
RGB = imread(‘peppers.png’);
[X, map] = rgb2ind(RGB, 256); % 256色に減色
% インデックスカラー画像をPNG形式で保存
imwrite(X, map, ‘peppers_indexed.png’);
“`
rgb2ind
関数はRGB画像をインデックスカラー画像に変換する関数です。インデックスカラー画像 (X
) は通常 uint8
または uint16
の行列、カラーマップ (map
) は K x 3
の double
型行列(値は0から1の範囲)となります。
PNG形式は、可逆圧縮のため画質劣化を避けたい場合や、透過情報が必要な場合に適しています。イラストや図、スクリーンショットなどの保存に向いています。
4.3 TIFF形式 (.tif, .tiff)
特徴:
- 多機能で柔軟: 様々な種類の画像データ、圧縮方式、ビット深度をサポートします。
- 可逆圧縮と非可逆圧縮: LZW, Deflate (ZIP), PackBitsなどの可逆圧縮や、JPEG圧縮などの非可逆圧縮を選択できます。
- 複数の画像を1ファイルに格納可能: 複数の画像を「ページ」または「レイヤー」として1つのTIFFファイルに保存できます。
- 多様なデータ型:
uint8
,uint16
,uint32
,single
,double
,int8
など、様々なデータ型をサポートします。 - メタデータ: 画像に関する様々な情報(タグ)を付加できます。
- 専門分野(出版、医療、科学)でよく使われます。
imwrite
での指定:
ファイル名の拡張子を .tif
または .tiff
とします。
matlab
imwrite(RGB, 'output.tif'); % RGB画像をTIFF形式で保存
imwrite(I, 'gray_output.tif'); % グレースケール画像をTIFF形式で保存
imwrite(X, map, 'indexed_output.tif'); % インデックスカラー画像をTIFF形式で保存
TIFF形式は、入力画像データの形式(Intensity, RGB, Indexed)とデータ型 (uint8
, uint16
など)を忠実に保持して保存する傾向があります。
複数の画像を1ファイルに格納 ('WriteMode', 'append'
)
TIFF形式の強力な機能の一つに、複数の画像を一つのファイルにまとめて保存できることがあります。これは、動画の各フレームを保存したり、マルチチャンネルの画像データ(例えば、異なる波長帯で撮影した画像)を保存したりするのに便利です。
最初の画像を保存する際は通常通り imwrite
を使いますが、2枚目以降の画像を同じファイルに追加する際には、'WriteMode', 'append'
オプションを指定します。
“`matlab
% 最初の画像をTIFFファイルに保存
img1 = imread(‘cameraman.tif’);
imwrite(img1, ‘multi_image.tif’);
% 2枚目の画像を同じファイルに追加
img2 = imread(‘circuit.tif’); % 別のサンプル画像
imwrite(img2, ‘multi_image.tif’, ‘WriteMode’, ‘append’);
% 3枚目の画像を同じファイルに追加 (例として少し加工)
img3 = imread(‘peppers.png’);
% TIFFはインデックスカラーもappend可能ですが、ここではグレースケールに変換して追加します
img3_gray = rgb2gray(img3);
imwrite(img3_gray, ‘multi_image.tif’, ‘WriteMode’, ‘append’);
% 保存したTIFFファイルを読み込む際は、imreadの2番目の引数でページ番号を指定できます
% img1_read = imread(‘multi_image.tif’, 1); % 1枚目
% img2_read = imread(‘multi_image.tif’, 2); % 2枚目
% img3_read = imread(‘multi_image.tif’, 3); % 3枚目
% imfinfo(‘multi_image.tif’) でファイルに含まれる画像の情報を確認できます
“`
この機能を使うと、時系列データや多次元データを一つの画像ファイルとして管理しやすくなります。
圧縮方法の指定 ('Compression'
)
TIFF形式では、画像をどのように圧縮するかを指定できます。デフォルトでは、入力データの種類に応じてMATLABが最適な圧縮方法を選択しますが、明示的に指定することも可能です。一般的な圧縮方法としては、'none'
(無圧縮), 'PackBits'
, 'Huffman'
, 'LZW'
, 'Deflate'
, 'JPEG'
などがあります。
“`matlab
% LZW圧縮で保存 (可逆圧縮)
imwrite(RGB, ‘peppers_lzw.tif’, ‘Compression’, ‘LZW’);
% Deflate (ZIP) 圧縮で保存 (可逆圧縮)
imwrite(RGB, ‘peppers_deflate.tif’, ‘Compression’, ‘Deflate’);
% 非可逆のJPEG圧縮で保存 (JPEGと同様にQualityオプションも使える)
imwrite(RGB, ‘peppers_jpeg_compressed.tif’, ‘Compression’, ‘JPEG’, ‘Quality’, 80);
“`
どの圧縮方法が利用できるかは、MATLABのバージョンやインストールされているライブラリによって異なる場合があります。可逆圧縮はファイルサイズは大きくなりますが画質を保ちたい場合に、非可逆圧縮はファイルサイズを小さくしたい場合に適しています。
ビット深度の指定 ('BitDepth'
)
PNGと同様に、TIFFでもビット深度を指定できますが、通常は入力データのデータ型に応じて自動的に適切なビット深度で保存されます。例えば、uint16
型の画像データは通常16ビット/チャンネルで保存されます。
その他のオプション:
TIFF形式では、他にも画像の解像度 ('Resolution'
), タイル分割 ('Tiled'
), メタデータ ('Description'
) など、様々なオプションを指定できます。これらのオプションはより高度な用途で使われます。詳細はMATLABのドキュメントを参照してください。
TIFF形式は非常に多機能であるため、画像処理の様々な状況に対応できます。特に、画質を劣化させずに保存したい場合や、複数の画像をまとめて管理したい場合などに有用です。
4.4 GIF形式 (.gif)
特徴:
- アニメーションをサポート: 複数の画像をまとめてアニメーションとして表示できます。
- インデックスカラー: 最大256色までのインデックスカラー画像のみをサポートします。真のカラー画像は直接保存できません(保存時にインデックスカラーに変換されます)。
- 可逆圧縮: LZW圧縮を使用します。
- 透過情報: 完全に透明または完全に不透明の透過情報をサポートします(PNGのような段階的な透過はできません)。
- Webで簡単なアニメーションなどに使われます。
imwrite
での指定:
ファイル名の拡張子を .gif
とします。GIF形式はインデックスカラー画像のみをサポートするため、カラー画像やグレースケール画像をGIFとして保存する場合、MATLABは自動的にインデックスカラーに変換しようとします。しかし、明示的に変換 (rgb2ind
など) してから保存する方が、色の数を制御できて望ましい結果が得られることが多いです。
“`matlab
% インデックスカラー画像の保存 (Xとmapが必要)
% 例:カラー画像を読み込み、インデックスカラーに変換
RGB = imread(‘peppers.png’);
[X, map] = rgb2ind(RGB, 256); % 256色に減色
% インデックスカラー画像をGIF形式で保存
imwrite(X, map, ‘peppers_indexed.gif’);
% RGB画像を直接GIFで保存しようとすると、自動でインデックスカラーに変換される
% imwrite(RGB, ‘peppers_auto_indexed.gif’); % 色の数がどうなるかはMATLABの内部処理による
“`
GIF形式で画像を保存する際は、必ず画像データ X
とカラーマップ map
の両方を imwrite
に渡す形式 (imwrite(X, map, filename)
) を使用することを推奨します。
アニメーションGIFの作成
GIF形式の最も特徴的な使い方はアニメーションです。複数の画像(フレーム)を順番に表示することでアニメーションを作成できます。アニメーションGIFを作成するには、最初のフレームを通常通り保存し、その後のフレームを 'WriteMode', 'append'
オプションで追加していきます。さらに、各フレームの表示時間 ('DelayTime'
) や繰り返し回数 ('LoopCount'
) などのオプションを指定します。
アニメーションGIFを作成する際のポイント:
- 全てのアニメーションフレームは、同じサイズである必要があります。
- 全てのアニメーションフレームは、同じカラーマップを使用する必要があります。最初に作成したカラーマップを使い回すか、全てをまとめてインデックスカラーに変換してから処理します。
- 最初のフレームを保存する際に
'LoopCount'
オプションで繰り返し回数を指定します(通常Inf
で無限ループ)。 - 各フレームを保存する際に
'DelayTime'
オプションでそのフレームの表示時間を指定します(秒単位)。
“`matlab
% アニメーションのフレームとなる画像を生成 (例: 簡単な図形の移動)
figure(‘Visible’, ‘off’); % フィギュアを非表示にしておく (描画だけ行う)
axis off;
nFrames = 20; % フレーム数
frames = cell(nFrames, 1); % 各フレームの画像データを格納するセル配列
% 各フレームを描画してキャプチャ
for k = 1:nFrames
% 例として、黒い背景に白い円を描画し、円を少しずつ移動させる
img_size = 200;
img = zeros(img_size, img_size, 3, ‘uint8’); % 黒い背景 (RGB)
center_x = round(img_size/2 + 50 * sin(k/nFrames * 2*pi)); % X座標を移動
center_y = round(img_size/2 + 50 * cos(k/nFrames * 2*pi)); % Y座標を移動
radius = 20;
% 円を描画 (簡単な方法として塗りつぶし)
[X, Y] = meshgrid(1:img_size, 1:img_size);
mask = ((X - center_x).^2 + (Y - center_y).^2) <= radius^2;
img(repmat(mask, [1 1 3])) = 255; % 円の部分を白くする
% RGB画像をインデックスカラーに変換 (共通のカラーマップを使用するのが望ましいが、ここではフレームごとに変換)
% より効率的な方法としては、全てをまとめて変換するか、最初のフレームのmapを使う
if k == 1
% 最初のフレームでカラーマップを生成
[X_frame, map] = rgb2ind(img, 256);
else
% 後続のフレームは、前のフレームのカラーマップを使って変換 (精度が落ちる可能性あり)
% または、全てのフレームをまとめて最適なカラーマップを計算
[X_frame, map] = rgb2ind(img, map); % 同じmapを使って変換
end
frames{k} = X_frame; % インデックスカラー画像データを格納
end
close; % 非表示のフィギュアを閉じる
% アニメーションGIFとして保存
outputFilename = ‘moving_circle.gif’;
delayTime = 0.1; % 各フレームの表示時間 (秒)
loopCount = Inf; % 無限ループ
% 最初のフレームを保存
imwrite(frames{1}, map, outputFilename, ‘gif’, ‘LoopCount’, loopCount, ‘DelayTime’, delayTime);
% 2フレーム目以降を追記
for k = 2:nFrames
imwrite(frames{k}, map, outputFilename, ‘gif’, ‘WriteMode’, ‘append’, ‘DelayTime’, delayTime);
end
disp([‘アニメーションGIFファイルを保存しました: ‘, outputFilename]);
“`
このコードは、円が動く簡単なアニメーションGIFを作成します。重要なのは、ループ内で各フレームのインデックスカラー画像データとカラーマップを取得し、最初のフレームを 'LoopCount'
オプション付きで保存し、その後のフレームを 'WriteMode', 'append'
オプションと 'DelayTime'
オプション付きで保存している点です。
GIF形式は、単純なアニメーションや、色の数が少ないイラストなどに適しています。写真など色の数が多い画像をGIFで保存すると、自動的に減色されるため画質が著しく劣化する可能性があることに注意が必要です。
4.5 BMP形式 (.bmp)
特徴:
- シンプルな構造: Windows環境で古くから使われている形式です。
- 非圧縮またはRun-length encoding (RLE) 圧縮: 通常は無圧縮で保存されるため、ファイルサイズが大きくなる傾向があります。
- カラー画像、グレースケール画像、インデックスカラー画像をサポートします。
- 透過情報はサポートしません。
imwrite
での指定:
ファイル名の拡張子を .bmp
とします。
matlab
imwrite(RGB, 'output.bmp'); % RGB画像をBMP形式で保存
imwrite(I, 'gray_output.bmp'); % グレースケール画像をBMP形式で保存
imwrite(X, map, 'indexed_output.bmp'); % インデックスカラー画像をBMP形式で保存
BMP形式は無圧縮または単純な圧縮しか行わないため、画質は保持されますが、ファイルサイズが非常に大きくなりやすいです。特別な理由がない限り、より効率的なPNGやJPEG形式を使用することが多いでしょう。
4.6 その他の形式
imwrite
は、前述の主要な形式以外にも、PPM, PGM, PBM (Netpbm formats), HDF4, HDF5, CUR, ICO, PCX, XWDなど、様々な形式をサポートしています。これらの形式は特定の用途や環境で使われます。
- PPM, PGM, PBM: シンプルなテキストまたはバイナリ形式で、画像データをそのまま表現します。デバッグや簡単な画像データのやり取りに使われることがあります。
- HDF4, HDF5: 科学技術分野で多次元データやメタデータとともに画像データを保存するのに使われる、より複雑な形式です。
- ICO, CUR: Windowsのアイコンファイル (.ico) やカーソルファイル (.cur) です。透過情報を含む場合があり、通常は小さな画像に使われます。
これらの形式で保存する際も基本的な imwrite(A, filename)
構文を使用します。形式によっては、利用できるオプションが異なります。特定の形式について詳しく知りたい場合は、MATLABのドキュメントを参照してください。
5. imwrite
関数の応用と便利なオプション
基本的な使い方と主要な画像形式での保存方法を理解したところで、imwrite
関数のさらに応用的な使い方や、いくつかの便利なオプションについて掘り下げましょう。
5.1 カラーマップを指定したインデックスカラー画像の保存
インデックスカラー画像を保存する際には、画像データ行列 X
と共にカラーマップ行列 map
を指定する必要があります。MATLABでは、この形式の imwrite
構文は imwrite(X, map, filename)
です。
X
は通常、uint8
または uint16
型の行列で、画素値はカラーマップのインデックス(多くの場合1から始まるか、0から始まる)に対応します。map
は K x 3
の double
型行列で、各行は対応するインデックスの色をRGB値(0から1の範囲)で表現します。
例えば、グレースケール画像をインデックスカラーとして保存し、カラーマップを使って擬似カラーを適用するような場合にこの形式が使われます。
“`matlab
% グレースケール画像を読み込み
I = imread(‘cameraman.tif’);
% グレースケール画像をインデックスカラーに変換
% グレースケールの場合、画素値そのものがインデックスとなり、
% 標準のグレースケールカラーマップ (0-1 に対応する 0-255 のグレースケール) が作成される
[X_gray, map_gray] = gray2ind(I, 256); % 256階調
% インデックスカラーとしてPNG保存
imwrite(X_gray, map_gray, ‘cameraman_indexed_gray.png’);
% 別のカラーマップを適用して保存 (例: ホットカラーマップ)
map_hot = hot(256); % 256色のホットカラーマップを生成
imwrite(X_gray, map_hot, ‘cameraman_indexed_hot.png’);
“`
gray2ind
はグレースケール画像をインデックスカラー画像に変換し、デフォルトのグレースケールカラーマップを生成します。hot
関数は、グラデーション状のカラーマップ(ここでは「ホット」カラーマップ)を生成する関数です。imwrite(X, map, filename)
の形式を使えば、任意のインデックスカラー画像データ X
と任意のカラーマップ map
を組み合わせて保存できます。
5.2 アルファチャンネル(透過情報)の保存 (再掲と補足)
PNG形式のセクションでも触れましたが、アルファチャンネルの保存は 'Alpha'
オプションを使います。
matlab
imwrite(A, filename, 'Alpha', alpha);
ここで A
はRGBまたはグレースケール画像データ、alpha
は同じサイズで単一チャンネル(M x N)の行列で、各画素のアルファ値を持ちます。
A
が uint8
または uint16
の場合、alpha
も同じデータ型であるべきで、値の範囲は uint8
なら 0-255、uint16
なら 0-65535 です。A
が double
や single
の場合、alpha
も同じデータ型であるべきで、値の範囲は 0-1 です。
透過マスク(画像の一部を完全に透明/不透明にしたい)をアルファチャンネルとして保存したい場合は、logical
型のマスク行列を 'Alpha'
オプションに渡すこともできます。この場合、false
が完全に透明、true
が完全に不透明として扱われます。
“`matlab
% RGB画像とマスク画像を読み込み
RGB = imread(‘peppers.png’);
mask = imread(‘mask.png’); % 例として白黒(2値)マスク画像と仮定
% マスクを論理型に変換 (白(255)がtrue、黒(0)がfalseになるように)
binaryMask = mask > 0; % 0より大きい値をtrueとする
% RGB画像をPNG形式で保存し、マスクをアルファチャンネルとして使用
imwrite(RGB, ‘peppers_masked.png’, ‘Alpha’, binaryMask);
“`
このように、アルファチャンネルとして、段階的な透過情報を持つ輝度画像や、単純な透過/非透過を示す論理型マスクを指定できます。
5.3 ビット深度の指定 ('BitDepth'
) (再掲と補足)
PNGやTIFF形式では、'BitDepth'
オプションを使って画素値のビット深度を指定できます。
matlab
imwrite(A, filename, 'BitDepth', D);
D
は指定したいビット数です。グレースケール画像の場合、D
は1, 2, 4, 8, 16などです。RGB画像の場合、D
はチャンネルあたりのビット数で、8または16を指定することが多いです(合計で24ビットまたは48ビットカラー)。
このオプションを使う際は、保存したい画像データ A
のデータ型が、指定したビット深度に対応しているか、または適切に変換可能である必要があります。例えば、'BitDepth', 16
を指定してグレースケール画像を保存する場合、入力画像 A
は uint16
型であるのが一般的です。uint8
型の画像を16ビット深度で保存しようとすると、MATLABは自動的に変換を行いますが、元の画像が持っていた8ビットの精度を超える情報が保存されるわけではありません。
より高いビット深度で保存したい場合は、元の画像データがその精度を持っている必要があります。例えば、12ビットや14ビットのカメラ画像などを読み込んだ場合、それらは uint16
型としてMATLABに読み込まれることが多いため、その uint16
型のデータをそのまま 'BitDepth', 16
で保存すれば、元の高精度な情報を維持できます。
5.4 メタデータの追加
一部のファイル形式(特にTIFF)では、画像データと一緒にテキスト形式のメタデータ(説明文など)を保存できます。TIFFの場合、'Description'
オプションなどが使えます。
matlab
% TIFF画像に説明文を追加して保存
imwrite(RGB, 'peppers_with_description.tif', 'Description', 'Sample image from MATLAB, processed on 2023-10-27.');
保存されたTIFFファイルを、対応する画像ビューアや情報表示ツールで開くと、この説明文を確認できる場合があります。これは、画像の由来や処理内容などを記録しておくのに便利です。他のファイル形式でもメタデータに関連するオプションがある場合があります。詳細は各形式のMATLABドキュメントを参照してください。
5.5 圧縮方法の指定 (再掲と補足)
TIFF形式で 'Compression'
オプションについて触れましたが、PNG形式でも 'Compression'
オプションを使って圧縮レベルを指定できます。
matlab
% PNG形式で圧縮レベルを指定 (0-9, 0が圧縮なし, 9が最大圧縮)
imwrite(RGB, 'peppers_png_comp9.png', 'Compression', 'deflate', 'BitDepth', 8, 'Compression', 9); % デフォルトはdeflate, レベルは通常6
PNGの圧縮は常に可逆ですが、圧縮レベルを上げると圧縮に時間がかかる代わりにファイルサイズが小さくなる可能性があります。
5.6 データ型と範囲の自動変換について
imwrite
は賢く、入力画像データ A
のデータ型と値の範囲、および指定されたファイル形式とビット深度に応じて、適切な変換を自動で行うことがあります。
double
またはsingle
型の画像: 通常、値が0から1の範囲であると想定されます。uint8
で保存する場合、0-1の範囲が0-255にスケーリングされます。uint16
で保存する場合、0-1の範囲が0-65535にスケーリングされます。uint8
またはuint16
型の画像: 値の範囲がそれぞれのデータ型で表現できる最大値(255または65535)までであると想定されます。これらのデータ型で保存する場合、通常値はそのまま保持されます(ただし、指定されたビット深度やファイル形式に制約される場合は変換されることもあります)。logical
型の画像 (二値画像):uint8
で保存する場合、false
は0、true
は255に変換されることが多いです。
この自動変換は便利ですが、意図しない結果になることもあります。例えば、double
型で0から255までの画素値を持つ画像を uint8
で保存したい場合、単純に imwrite
に渡すと、0から1に正規化されてから0-255に再スケーリングされてしまう可能性があります。
このような場合、保存前に目的のデータ型に明示的に変換することを推奨します。MATLABのImage Processing Toolboxには、データ型変換のための便利な関数があります。
im2uint8(I)
: 画像I
をuint8
型に変換します。入力がdouble
やsingle
の場合は0-1の範囲を0-255にスケーリング、uint16
の場合は0-65535を0-255にスケーリングします。im2uint16(I)
: 画像I
をuint16
型に変換します。入力がdouble
やsingle
の場合は0-1の範囲を0-65535にスケーリング、uint8
の場合は0-255を0-65535にスケーリングします。im2double(I)
: 画像I
をdouble
型に変換します。入力が整数型の場合は0-255または0-65535の範囲を0-1にスケーリングします。
例:double
型で値が0から255の範囲にあるグレースケール画像を uint8
で保存したい場合。
“`matlab
% double 型で 0-255 の値を持つ画像 (例)
I_double = rand(100, 100) * 255;
% そのままimwriteすると、doubleが0-1と見なされてスケール変換される可能性がある
% imwrite(I_double, ‘double_auto_scaled.png’);
% 意図した通り uint8 (0-255) として保存するには、明示的に変換
I_uint8 = im2uint8(I_double / 255); % 0-255を0-1に正規化してからim2uint8
% または、Mapping Toolbox があれば gray2ind を使う方法も有効
% [X, map] = gray2ind(I_double, 256);
% imwrite(X, map, ‘double_converted_uint8.png’); % Map形式でuint8を保存
% もしくは、0-255のdoubleを0-255のuint8に単純キャストしたい場合
I_uint8_cast = uint8(round(I_double)); % 値を丸めてuint8にキャスト
imwrite(I_uint8_cast, ‘double_cast_uint8.png’); % これが意図した動作に近いことが多い
“`
一般的に、画像の保存前にデータ型を uint8
や uint16
に変換しておくと、imwrite
の挙動が予測しやすくなります。特に画素値の範囲が重要な場合は、変換関数 (im2uint8
, im2uint16
, im2double
など) を適切に使用することを検討してください。
6. よくある問題とトラブルシューティング
imwrite
関数を使う上で、特に初心者の方が遭遇しやすい問題とその解決策をいくつか紹介します。
問題1: ファイルが存在しない、または書き込み権限がない
指定した保存先のフォルダが存在しない、またはMATLABを実行しているユーザーにそのフォルダへの書き込み権限がない場合に発生します。
- エラーメッセージ例:
Error using imwrite Permission denied: C:\...\myfile.png.
またはError using imwrite Directory not found: C:\...\myfolder\
- 解決策:
- 指定したパスが正しいか、フォルダが存在するか確認してください。必要であれば、MATLABの
mkdir
関数を使ってフォルダを作成できます。 - 保存先のフォルダに対する書き込み権限があるか確認してください。エクスプローラー(Windows)やFinder(macOS)でフォルダのプロパティを確認したり、別の場所に保存できるか試したりしてください。
- MATLABを管理者権限で実行することで解決する場合もあります(ただし推奨される方法ではありません)。
- 指定したパスが正しいか、フォルダが存在するか確認してください。必要であれば、MATLABの
問題2: サポートされていないファイル形式を指定した
imwrite
が対応していないファイル形式の拡張子を指定した場合に発生します。
- エラーメッセージ例:
Error using imwrite File format "xyz" is not supported.
- 解決策:
imformats
コマンドを実行して、MATLABが現在サポートしている画像ファイル形式のリストを確認してください。リストにある形式の拡張子を使用してください。
問題3: 画像データが不適切な形式(次元、データ型)である
imwrite
に渡した画像データ A
が、予期しない次元数を持っていたり、ファイル形式に対応しないデータ型であったりする場合に、エラーになるか、意図しない結果になることがあります。
- エラーメッセージ例:
Error using imwrite Invalid number of dimensions for image data.
など - 解決策:
- 入力データ
A
のサイズを確認してください (size(A)
)。グレースケールや二値画像はM x N
、カラー画像はM x N x 3
である必要があります。 - 入力データ
A
のデータ型を確認してください (class(A)
)。通常uint8
,uint16
,double
,single
,logical
などが使われます。指定するファイル形式とビット深度に合わせて、必要であればim2uint8
,im2uint16
,im2double
,logical
などで事前に変換してください。 - インデックスカラー画像を保存する場合は、画像データ
X
はM x N
行列、カラーマップmap
はK x 3
行列である必要があります。また、imwrite(X, map, filename)
の形式で呼び出す必要があります。
- 入力データ
問題4: カラーマップを指定し忘れた、または不適切に指定した(インデックスカラーの場合)
インデックスカラー画像データ (M x N
行列 X
) を imwrite(X, filename)
の形式で保存しようとした場合などに発生します。
- エラーメッセージ例:
Error using imwrite Colormap must be supplied when writing indexed images.
- 解決策: インデックスカラー画像を保存する際は、必ず画像データ行列
X
とカラーマップ行列map
の両方をimwrite
に渡す形式imwrite(X, map, filename)
を使用してください。map
はdouble
型で0から1の範囲の値を持つK x 3
の行列である必要があります。
問題5: パスの区切り文字が間違っている
特にWindowsとmacOS/Linux間でコードをやり取りする場合に、パスの区切り文字(\
と /
)が問題になることがあります。
- エラーメッセージ例:
Error using imwrite The system cannot find the path specified.
- 解決策: MATLABでは、Windowsでも
/
をパス区切り文字として使用できます。OSに関わらず/
を使用するか、fullfile
関数を使ってOSに応じた適切なパス文字列を生成することを推奨します。
matlab
% 例: resultsフォルダに画像を保存
outputDir = 'results';
if ~exist(outputDir, 'dir')
mkdir(outputDir); % フォルダが存在しなければ作成
end
filename = 'myimage.png';
fullOutputPath = fullfile(outputDir, filename); % OSに応じたパス文字列を生成
imwrite(A, fullOutputPath);
fullfile
関数を使うと、パスの区切り文字やプラットフォームの違いを意識せずにファイルパスを構築できます。
これらのトラブルシューティングのヒントが、imwrite
使用時の問題解決に役立つことを願っています。エラーメッセージをよく読み、MATLABのヘルプドキュメント (doc imwrite
) も参考にすると、さらに詳細な情報を得られます。
7. 実践的な例
ここでは、MATLABで画像を読み込み、簡単な処理を施し、複数の形式で保存する一連のワークフローを示す具体的なコード例をいくつか紹介します。
例1: 画像の読み込み、グレースケール変換、複数形式での保存
“`matlab
% 1. 画像を読み込む
% サンプルカラー画像を読み込みます
originalRGB = imread(‘peppers.png’);
figure;
imshow(originalRGB);
title(‘元のカラー画像’);
% 2. 画像処理を行う (例: グレースケール変換)
grayImage = rgb2gray(originalRGB);
figure;
imshow(grayImage);
title(‘グレースケール画像’);
% 3. 処理結果を異なる形式で保存する
outputDir = ‘processed_images’;
if ~exist(outputDir, ‘dir’)
mkdir(outputDir); % 保存用フォルダを作成
end
% PNG形式で保存 (可逆圧縮, 高画質)
pngFilename = fullfile(outputDir, ‘peppers_gray.png’);
imwrite(grayImage, pngFilename);
disp([‘保存しました: ‘, pngFilename]);
% JPEG形式で保存 (非可逆圧縮, 品質指定)
jpegFilename = fullfile(outputDir, ‘peppers_gray.jpg’);
imwrite(grayImage, jpegFilename, ‘Quality’, 85); % 品質85で保存
disp([‘保存しました: ‘, jpegFilename]);
% TIFF形式で保存 (可逆圧縮, LZW圧縮指定)
tifFilename = fullfile(outputDir, ‘peppers_gray.tif’);
imwrite(grayImage, tifFilename, ‘Compression’, ‘LZW’);
disp([‘保存しました: ‘, tifFilename]);
% 4. 保存された画像を読み込んで確認 (オプション)
% gray_png = imread(pngFilename);
% gray_jpeg = imread(jpegFilename);
% gray_tif = imread(tifFilename);
% figure; subplot(1,3,1); imshow(gray_png); title(‘PNG’);
% subplot(1,3,2); imshow(gray_jpeg); title(‘JPEG’);
% subplot(1,3,3); imshow(gray_tif); title(‘TIFF’);
“`
この例では、カラー画像を読み込み、グレースケールに変換し、その結果をPNG、JPEG、TIFFの3つの異なる形式で保存しています。保存先フォルダの作成や fullfile
関数の使用など、実践的なコードの書き方も含んでいます。
例2: MATLABで生成した画像を保存する
画像はファイルから読み込むだけでなく、MATLABの関数を使って生成することもできます。例えば、テスト画像や合成画像などです。
“`matlab
% 1. テスト画像の生成 (例: チェック模様)
img_size = 256;
checkerboard_img = checkerboard(20, img_size/40, img_size/40); % 20×20画素のチェック模様, 128×128サイズ
figure;
imshow(checkerboard_img);
title(‘生成したチェック模様画像 (double)’);
% checkerboard関数はdouble型の0-1の画像データを返します
% 2. 保存先の準備
outputDir = ‘generated_images’;
if ~exist(outputDir, ‘dir’)
mkdir(outputDir);
end
% 3. 画像を保存 (uint8に変換してPNG保存)
% double型の0-1画像をuint8の0-255画像に変換してから保存するのが一般的
checkerboard_uint8 = im2uint8(checkerboard_img);
pngFilename = fullfile(outputDir, ‘checkerboard.png’);
imwrite(checkerboard_uint8, pngFilename);
disp([‘保存しました: ‘, pngFilename]);
% (参考) doubleのままPNGに保存した場合
% imwrite(checkerboard_img, fullfile(outputDir, ‘checkerboard_double.png’));
% この場合も通常は0-1が0-255にスケールされてuint8として保存される
% 4. インデックスカラー画像として保存 (例えばGIF)
% 生成したdouble画像をインデックスカラーに変換
[X_cb, map_cb] = gray2ind(checkerboard_img, 2); % 白と黒の2色なので2色に減色
gifFilename = fullfile(outputDir, ‘checkerboard.gif’);
imwrite(X_cb, map_cb, gifFilename); % インデックスカラーとしてGIF保存
disp([‘保存しました: ‘, gifFilename]);
“`
この例では、checkerboard
関数で生成した double
型のテスト画像を、im2uint8
で変換してからPNGとして保存し、また gray2ind
でインデックスカラーに変換してからGIFとして保存しています。double
型の画像を保存する際の注意点も示しています。
例3: MATLABのフィギュア(グラフなど)を画像ファイルとして保存する
画像データ (uint8
などの行列) を直接保存するだけでなく、MATLABで作成したグラフや図(フィギュア)を画像ファイルとして保存したい場合もあります。これには主に2つの方法があります。
saveas
関数を使う: 最も簡単で一般的な方法です。現在アクティブなフィギュア、または指定したフィギュアをファイルに保存します。画像形式だけでなく、FIG形式やコード形式でも保存できます。getframe
またはprint
関数を使う: フィギュアの内容を画像データとしてキャプチャし、その画像データをimwrite
で保存する方法です。より細かい制御が可能ですが、少し手間がかかります。
ここでは saveas
関数を使った簡単な例を示します。
“`matlab
% 1. MATLABでグラフを作成する
x = 0:0.1:10;
y = sin(x);
figure; % 新しいフィギュアウィンドウを作成
plot(x, y);
title(‘Sine Wave’);
xlabel(‘X’);
ylabel(‘sin(X)’);
% 2. 作成したフィギュアを画像ファイルとして保存する
% saveas(figure_handle, filename, fileformat) または saveas(figure_handle, filename)
% figure_handle が省略された場合は現在アクティブなフィギュアが対象になります。
% fileformat は ‘-png’, ‘-jpg’, ‘-tif’, ‘-bmp’ などの文字列で指定します。
outputDir = ‘figure_exports’;
if ~exist(outputDir, ‘dir’)
mkdir(outputDir);
end
% PNG画像として保存
saveas(gcf, fullfile(outputDir, ‘sine_wave.png’), ‘png’); % gcf は現在アクティブなフィギュアのハンドルを取得
disp([‘フィギュアをPNGとして保存しました: ‘, fullfile(outputDir, ‘sine_wave.png’)]);
% JPEG画像として保存
saveas(gcf, fullfile(outputDir, ‘sine_wave.jpg’), ‘jpg’);
disp([‘フィギュアをJPEGとして保存しました: ‘, fullfile(outputDir, ‘sine_wave.jpg’)]);
% PDFファイルとして保存することも多い
saveas(gcf, fullfile(outputDir, ‘sine_wave.pdf’), ‘pdf’);
disp([‘フィギュアをPDFとして保存しました: ‘, fullfile(outputDir, ‘sine_wave.pdf’)]);
“`
saveas
関数は非常に便利で、様々な形式での保存に対応しています。フィギュアをビットマップ画像形式(PNG, JPEG, TIFF, BMPなど)として保存する際には、MATLABはフィギュアの内容を画像データにレンダリングし、それをファイルに書き出します。
もし、フィギュアの内容を画像データ行列として取得してから自分で処理・保存したい場合は、getframe
関数や print
関数(特に '<device> = -d<format>'
オプションを使って画像形式を指定する)が役立ちます。取得した画像データ(通常はカラー画像データ)は imwrite
を使って保存できます。
“`matlab
% (参考) getframeを使ってフィギュアを画像データとして取得し、imwriteで保存
figure; % 新しいフィギュアウィンドウを作成
plot(x, y);
title(‘Sine Wave’);
xlabel(‘X’);
ylabel(‘sin(X)’);
frame = getframe(gcf); % 現在のフィギュアをフレームとしてキャプチャ
% frame.cdata に画像データ (M x N x 3 uint8) が格納されている
imwrite(frame.cdata, fullfile(outputDir, ‘sine_wave_captured.png’));
disp([‘フィギュアをキャプチャし、imwriteで保存しました: ‘, fullfile(outputDir, ‘sine_wave_captured.png’)]);
“`
このように、MATLABで生成した画像データ以外のグラフィカルな出力も、画像ファイルとして保存することが可能です。
8. まとめ
この記事では、MATLABで画像をファイルに保存するために不可欠な imwrite
関数について、初心者の方にも分かりやすく解説しました。
- まず、MATLABが画像をどのように表現するか(Intensity, RGB, Binary, Indexed Image、そしてデータ型)を理解することの重要性を説明しました。
imwrite
関数の最も基本的な構文imwrite(A, filename)
から始め、画像データを指定したファイル名(拡張子で形式を判断)で保存できることを学びました。- 主要な画像ファイル形式(JPEG, PNG, TIFF, GIF, BMP)について、それぞれの特徴、
imwrite
での指定方法、そして形式ごとに利用できる重要なオプション('Quality'
,'Alpha'
,'BitDepth'
,'Compression'
,'WriteMode'
など)を詳しく解説しました。特に、透過情報を扱うPNG、多機能なTIFF、アニメーションに対応するGIFの使い方は、それぞれのオプションとともに丁寧に説明しました。 imwrite(X, map, filename)
の構文を使ったインデックスカラー画像の保存方法や、double
型などの画像データを適切に保存するためのデータ型変換についても触れました。imwrite
を使う上でのよくある問題点(ファイルパス、形式のサポート、データ形式、カラーマップなど)とそのトラブルシューティング方法を紹介しました。- 最後に、実際の画像処理やフィギュアの保存における
imwrite
(saveas
とも関連させて) の実践的な使用例を示しました。
imwrite
関数は非常に強力で柔軟なツールです。この記事で紹介した基本的な使い方や主要なオプションを理解すれば、あなたのMATLABでの画像処理の結果を、様々な要件に合わせて適切にファイルとして保存できるようになるはずです。
画像処理の学習は、単に画像を読み込んで処理するだけでなく、その結果を効果的に保存・共有することまでを含みます。imwrite
関数をマスターし、あなたの画像処理プロジェクトをさらに発展させていきましょう!
さらに深く学びたい場合は、MATLABのコマンドウィンドウで doc imwrite
と入力して、公式のドキュメントを参照してください。そこには、この記事では紹介しきれなかったより詳細な情報や、特定のファイル形式に関するさらなるオプションが記載されています。
それでは、あなたのMATLAB画像処理の旅が、ファイル保存という重要なステップを自信を持って進められるものとなるよう願っています!