image オブジェクトとそのプロパティ
Image CData
メモ
image
と imagesc
コマンドは、image オブジェクトを作成します。image オブジェクトは、line、surface、patch、text オブジェクトと同様、axes オブジェクトの子オブジェクトです。すべてのグラフィックス オブジェクトと同様に、image オブジェクトには、スクリーン上での外観を微調整するためのさまざまなプロパティがあります。image オブジェクトの外観に関する最も重要なプロパティは、CData
、CDataMapping
、XData
、YData
です。これらのプロパティは、この節と次の節で説明されています。image オブジェクトのすべてのプロパティの詳細については、image
コマンドを参照してください。
image オブジェクトの CData
プロパティは、データ配列を含んでいます。次のコマンドにおいて、h
は image
で作成した image オブジェクトのハンドルであり、行列 X
と Y
は同じです。
h = image(X); colormap(map) Y = get(h,'CData');
CData
配列の次元によって、カラーマップのカラーによってイメージを表示するか、RGB イメージとして表示するかを制御します。CData
配列が 2 次元の場合、イメージはインデックス付きのイメージか強度イメージのいずれかであり、いずれの場合もイメージはカラーマップのカラーを使って表示されます。一方、CData
配列が m x n x 3 の場合、カラーマップのカラーは無視され、トゥルーカラー イメージとして表示されます。
Image CDataMapping
CDataMapping
プロパティは、イメージが indexed
であるか、intensity
であるかを制御します。インデックス付きイメージを表示するには、CDataMapping
プロパティを 'direct'
に設定して、CData
配列の値が直接 Figure のカラーマップのインデックスとして使用されるようにします。image
コマンドを単一の入力引数で使用すると、CDataMapping
の値は 'direct'
に設定されます。
h = image(X); colormap(map) get(h,'CDataMapping') ans = direct
強度イメージは、CDataMapping
プロパティを 'scaled'
に設定することによって表示されます。この場合、CData
の値は線形にスケーリングされ、カラーマップ インデックスを形成します。座標軸の CLim
プロパティは倍率をコントロールします。関数 imagesc
は、image オブジェクトの CDataMapping
プロパティを 'scaled'
に設定して作成し、親の座標軸の CLim
プロパティを調整します。以下に例を示します。
h = imagesc(I,[0 1]); colormap(map) get(h,'CDataMapping') ans = scaled get(gca,'CLim') ans = [0 1]
XData と YData
XData
および YData
プロパティは、イメージの座標系をコントロールします。m 行 n 列のイメージの場合、既定の XData
は [1 n]
で、既定の YData
は [1 m]
です。これらの設定は、次の意味を含みます。
イメージの左側列の x 座標が 1
イメージの右側列の x 座標が n
イメージの最上行の y 座標が 1
イメージの最下行の y 座標が m
イメージの座標系
既定の座標系の使用
既定の座標系を使用して、イメージを表示します。colorcube
マップにある色を使用します。
C = [1 2 3 4; 5 6 7 8; 9 10 11 12]; im = image(C); colormap(colorcube)
座標系の指定
イメージを表示し、座標系を指定します。colorcube
マップにある色を使用します。
C = [1 2 3 4; 5 6 7 8; 9 10 11 12]; x = [-1 2]; y = [2 4]; figure image(x,y,C) colormap(colorcube)
イメージ データへのテキストの追加
この例では、配列インデックス付けを使用して、テキストを既存のイメージにラスタライズする方法を説明します。
関数 text
を使用して、テキストを座標軸に描画します。次に、getframe
を使用して画面からテキストをキャプチャし、Figure を閉じます。
fig = figure; t = text(.05,.1,'Mandrill Face','FontSize',20,'FontWeight','bold'); F = getframe(gca,[10 10 200 200]); close(fig)
getframe
から返された RGB イメージの結果から任意の平面を選択します。黒いピクセル (黒は 0) を検出し、sub2ind
を使ってそれらの添字をインデックスに変換します。これらの添字を使用して、mandrill
という MAT ファイルに含まれるイメージにテキストを "ペイント" します。そのイメージのサイズおよびテキストの行と列の位置を使用して、新しいイメージ内での位置を決定します。ピクセルを置き換えて、新しいイメージにインデックスを付けます。
c = F.cdata(:,:,1);
[i,j] = find(c==0);
load mandrill
ind = sub2ind(size(X),i,j);
X(ind) = uint8(255);
bone カラーマップを使用して新しいイメージを表示します。
imagesc(X)
colormap bone
高速なイメージ更新のための手法
image オブジェクトの CData
プロパティを更新する速度を上げるために、CData
を最適化し、関連する Figure および座標軸のプロパティを設定します。
可能な限り小さいデータ型を使用します。イメージに対して
uint8
データ型を使うと、double
データ型よりも高速です。イメージの
CData
プロパティの設定プロセスの部分は、イメージの利用のための行列のコピーを含みます。行列の全体のサイズは、個々の要素のサイズにより異なります。小さい要素 (すなわち小さいデータ型) を使うと、行列サイズが小さくなり、行列のコピーに必要な時間が削減されます。最小の許容可能な行列を使います。
イメージの表示速度を最優先する場合、イメージのサイズと質については妥協しなければならないことがあります。サイズを小さくすると、行列のコピーに必要な時間が削減されます。
座標軸の軸範囲モード プロパティ (
XLimMode
とYLimMode
) をmanual
に設定します。これらが
auto
に設定されている場合、 オブジェクト (image、line、patch 等) がデータの何らかの外観を変更するたびに、座標軸は関連するプロパティを再計算する必要があります。たとえば、以下のように指定したとします。image(firstimage); set(gca, 'xlimmode','manual',... 'ylimmode','manual',... 'zlimmode','manual',... 'climmode','manual',... 'alimmode','manual');
座標軸はイメージを再描画する前に制限値を再計算しません。
作業の要点がスクリーン上の一連のイメージの表示を簡略化することである場合は、
movie
オブジェクトの利用を検討してください。MATLAB® の
movie
オブジェクトは、MATLAB オブジェクト コードを実行する代わりに基礎となるシステムのグラフィックス リソースを直接利用します。これは上記で説明したとおり、イメージのCData
プロパティを繰り返し設定するよりも高速です。