MATLAB でのイメージ タイプの処理
MATLAB® では、イメージが配列 (多くの場合、2 次元行列) として表現され、この配列の各要素は表示されるイメージの 1 ピクセルに対応します。MATLAB でのイメージの処理は、他の型の行列データと同様に行われ、2 次元データをイメージとして表示できます。イメージを表示するには 2 つの一般的な方法があります。
イメージ ファイルの読み取りと表示 —
imshowを使用してイメージ ファイルを表示します。このファイルは通常、画像を表現します。イメージとしての配列データの表示 —
imageまたはimagescを使用して配列データを表示します。このデータは画像を表現するとは限らず、イメージとして可視化できる複雑なパターンを含んでいることがあります。
イメージ タイプ
一般的なイメージ タイプには、インデックス付き、グレースケール (強度)、RGB (トゥルーカラー) の 3 つがあり、配列の次元はさまざまです。次の表にイメージ タイプの概要を示します。
| イメージ タイプ | データ行列 | カラーマップ行列 | 例 |
|---|---|---|---|
| インデックス付きイメージ | "m" 行 "n" 列 | "p" 行 3 列 |
|
| グレースケール (強度) イメージ | "m" 行 "n" 列 | 既定ではなしですが、カラーマップを適用できます。 |
|
| RGB (トゥルーカラー) イメージ | "m"×"n"×3 | なし |
|
イメージ ファイルを処理する場合は、関数 imfinfo を使用してイメージ タイプをチェックできます。たとえば、peppers.png のイメージ タイプを判別します。
info = imfinfo("peppers.png");
info.ColorTypeans = 'truecolor'
イメージ ファイルの読み取りと表示
イメージの処理では、多くの場合、イメージ データを MATLAB ワークスペースに読み込んでイメージを表示し、イメージ データを操作します。ただし、イメージの処理プロセスはイメージ タイプによって異なります。
インデックス付きイメージ
インデックス付きイメージは、イメージ データ行列 X とカラーマップ行列 map として保存されます。map の各行は、単一色を構成する赤、緑、青の成分を指定するものです。インデックス付きイメージは、ピクセル値をカラーマップ値に "直接マッピング" したものを使います。各イメージ ピクセルの色は、対応する X の値をカラーマップに格納されているカラー値へのインデックス (ポインター) として用いることで決定されます。X は"m" 行 "n" 列の行列で、値 1 は map の 1 番目の行、値 2 は 2 番目の行というように、値を示す整数で構成されます。
たとえば、次のトウモロコシのインデックス付きイメージでは、データ行列の値 2 はカラーマップの 2 行目のインデックスであり、データ行列の値 15 はカラーマップの 15 行目のインデックスです。

インデックス付きイメージの読み取りと表示
インデックス付きイメージは imread を使用して読み込み、出力引数としてデータ行列 X とカラーマップ map の両方を指定します。その後、カラーマップを使用してデータ行列を表示します。
[X,map] = imread("corn.png");
imshow(X,map)
map はイメージ ファイルに関連付けられたカラーマップを格納します。ただし、関数 imshow を使用して任意のカラーマップを指定できます。たとえば、map をグレースケール カラーマップに変換してイメージ データを新しいカラーマップで表示します。
newmap = cmap2gray(map); imshow(X,newmap)

行列の添字付けを使って、イメージ データ行列から単一ピクセルを選択できます。イメージ データ行列のサイズはイメージのピクセル数に対応します。たとえば、X は 415 行 312 列のピクセルからなるイメージを表現します。
sz = size(X)
sz = 1×2
415 312
X の 2 行 15 列目のピクセルのカラーマップ インデックスを取得します。
val = X(2,15)
val = uint8
39
map にインデックスを付けて、このピクセルの赤、緑、青の強度に対応する 3 つの値を表示します。
color = map(val,:)
color = 1×3
0.4588 0.2902 0.2627
グレースケール (強度) イメージ
グレースケール イメージは "強度" イメージと呼ばれることもあり、"m" 行 "n" 列のデータ行列 X として保存され、その値は何らかの範囲内の強度を表します。グレースケール イメージは単一の行列として表され、その行列の各要素が 1 つのイメージ ピクセルに対応します。グレースケール イメージがカラーマップと共に保存されることはまれですが、グレースケール イメージの表示にグレースケール カラーマップが使われることはあります。基本的に、グレースケール イメージはインデックス付きイメージとして取り扱われます。
たとえば、次のトウモロコシのグレースケール イメージでは、データ行列に各ピクセルの強度を表す範囲 [0, 255] の整数が含まれています。

グレースケール イメージの読み取りと表示
グレースケール イメージをワークスペースに読み込んで表示します。
X = imread("corn_gray.png");
imshow(X)
別のカラーマップを使用してグレースケール イメージを表示できます。たとえば、winter カラーマップを使用して、グレースケール イメージを青と緑の色調で表示します。
imshow(X,winter)

行列の添字付けを使って、イメージのピクセル強度にアクセスできます。たとえば、X の 2 行 15 列目のピクセルのグレースケール強度値を取得します。
val = X(2,15)
val = uint8
156
RGB (トゥルーカラー) イメージ
RGB イメージは、しばしばトゥルーカラー イメージと言われ、各ピクセルの赤、緑、青成分を定義する m×n×3 のデータ配列として保存されます。グラフィックス ファイル形式では、RGB イメージが 24 ビット イメージ (赤、緑、青の成分がそれぞれ 8 ビット) として保存されます。この配置により、1600 万色を表す可能性を示しています。実物のイメージを表現できる精度であるということから、“トゥルーカラー イメージ” という用語が使用されています。
RGB イメージは、カラーマップを使いません。各ピクセルのカラーは、ピクセルの位置での各色平面に格納されている赤、緑、青の強度の組み合わせで決定されます。たとえば、RGB イメージ X におけるピクセル (10, 5) の赤、緑、青の色成分は、それぞれ、X(10,5,1)、X(10,5,2)、X(10,5,3) に保存されます。

RGB イメージの読み取りと表示
RGB イメージを読み込みます。RGB イメージ データは、各ピクセルが赤、緑、および青の強度値で表される "m"×"n"×3 の配列として保存されるため、イメージ データ X にはカラー データが含まれています。次に、イメージを表示します。
X = imread("earth.jpg");
imshow(X)
RGB イメージのデータ配列を使用すると、イメージのサイズと色に簡単にアクセスできます。イメージ データ配列のサイズはイメージのピクセル数に対応します。たとえば、X は 257 行 250 列のピクセルからなるイメージを表現します。
size(X)
ans = 1×3
257 250 3
ピクセルの色を決定するには、データ配列の 3 番目の次元に格納されている RGB 3 成分を調べてください。たとえば、X の 50 行 150 列目のピクセルの色を取得します。要素は、それぞれ赤、緑、青の順でピクセルの色の強度を 0 ~ 255 の範囲で表します。
color = X(50,150,1:3)
color = 1×1×3 uint8 array
color(:,:,1) =
119
color(:,:,2) =
102
color(:,:,3) =
110
イメージとしての配列データの表示
配列データの処理では、データ値の相対的な強度などの複雑なパターンを理解し解析するために、そのデータをイメージとして表示できます。関数 image および imagesc を使用して、ワークスペースにある 2 次元行列のデータをイメージとして表示し、それにカラーマップを適用できます。
たとえば、2 次元行列を作成します。次に、それをイメージとして表示します。
X = 4*peaks(100); image(X)

データ値の差をさらにわかりやすく可視化するには、関数 imagesc を使用してカラーマップを指定することによって、イメージ データの表示方法をカスタマイズします。イメージをカラー バーと共に表示すると、さまざまな強度に応じて適用されたカラーマップに対して、イメージ データがどのようにマッピングされているかを確認できます。
imagesc(X); colormap(turbo) colorbar
座標軸の範囲のスタイルを "equal" に設定して、MATLAB でイメージの縦横比が保持され、ピクセルが正方形で表示されるようにします。さらに、座標軸の範囲を設定します。
axis equal
xlim([0 100])
ylim([0 100])


