ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

imtransform

2 次元空間変換をイメージに適用

関数 imtransform は推奨されません。代わりに imwarp を使用してください。

構文

B = imtransform(A,tform)
B = imtransform(A,tform,interp)
[B,xdata,ydata] = imtransform(...)
[B,xdata,ydata] = imtransform(...,Name,Value)

説明

B = imtransform(A,tform) は、tform で定義された 2 次元空間変換に従ってイメージ A を変換します。ndims(A) > 2 の場合、たとえば、RGB イメージの場合、同じ 2 次元変換が、より高い次元に沿って、すべての 2 次元平面に適用されます。

B = imtransform(A,tform,interp) は、使用する内挿の形式を指定します。

[B,xdata,ydata] = imtransform(...) は、出力 X-Y 空間に出力イメージ B の位置を返します。既定の設定では、imtransform は、イメージ A を変換したものを B がすべて含むように、xdataydata を自動的に計算します。ただし、この自動計算は、'XData' 引数と 'YData' 引数の値を指定することによって、オーバーライドできます。

[B,xdata,ydata] = imtransform(...,Name,Value) は、1 つまたは複数の Name,Value の組み合わせの引数で指定された空間変換のさまざまな特性を制御するための追加オプションをもつイメージを変換します。

入力引数

A

任意の非スパース数値クラス (実数または複素数) または logical クラスのイメージ。

tform

maketform または cp2tform によって返される空間変換構造。imtransform は、変換 tform に対する空間座標系の表現を使います。特に、変換の最初の次元は、水平方向または x 座標で、2 番目の次元は、垂直方向または y 座標です。この表現は、MATLAB® の配列添字の表現の逆になっています。

interp

使用する内挿の形式。'bicubic''bilinear' または 'nearest' (最近傍) のいずれかに指定します。あるいは、interp は、関数 makeresampler で出力される resampler 構造体としても設定できます。このオプションは、imtransform によるリサンプリングの方法をより制御可能にします。

既定値: 'bilinear'

名前/値のペアの引数

オプションの Name,Value 引数のコンマ区切りの組み合わせ。ここで、Name は引数名で、Value は対応する値です。Name は、単一引用符 (' ') で表示され、大文字と小文字の区別はありません。複数の名前と値のペアの引数は、Name1Value1、...、NameNValueN の順に指定できます。

'UData'

2 要素の実数ベクトルは、'VData' と組み合わされた場合、2 次元入力空間 U-V におけるイメージ A の空間的な位置を指定します。'UData' の 2 つの要素は、それぞれ A の最初と最後の列の u 座標 (水平) を与えます。

既定値: [1 size(A,2)]

'VData'

2 要素の実数ベクトルは、'UData' と組み合わされた場合、2 次元入力空間 U-V におけるイメージ A の空間的な位置を指定します。'VData' の 2 つの要素は、それぞれ A の最初と最後の行の v 座標 (垂直) を与えます。

既定値: [1 size(A,1)]

'XData'

2 要素の実数ベクトルで、'YData' と組み合わされた場合、2 次元出力空間 X-Y の出力イメージ B の空間的な位置を決定します。'XData' の 2 つの要素は、B の最初と最後の列の x 座標 (垂直座標) を与えます。

既定値: 'XData''YData' が設定されていない場合、imtransform は、変換された出力イメージ全体を含むように値を計算します。これらの値を決定するため、imtransform は関数 findbounds を使用します。

'YData'

2 要素の実数ベクトルで、'XData' と組み合わされた場合、2 次元出力空間 X-Y の出力イメージ B の空間的な位置を決定します。'YData' の 2 つの要素は、B の最初と最後の行の y 座標 (水平座標) を与えます。

既定値: 'XData''YData' が設定されていない場合、imtransform は、変換された出力イメージ全体を含むように値を計算します。これらの値を決定するため、imtransform は関数 findbounds を使用します。

'XYScale'

1 または 2 要素の実数ベクトルです。'XYScale' の最初の要素は、X-Y 空間での各出力ピクセルの幅を指定します。(存在すれば) 2 番目の要素は、各出力ピクセルの高さを指定します。'XYScale' が 1 要素のみの場合、同じ値が幅と高さに使われます。

既定の設定: 'XYScale' が指定されず、'Size' が指定されている場合、imtransform は、'Size''XData' および 'YData' から 'XYScale' を計算します。'XYScale''Size' も与えられない場合、imtransform は、大きすぎる出力イメージになる場合を除いて、'XYScale' の入力ピクセルのスケールを使用します。

    メモ:   入力イメージのスケールを保持すると、大きすぎる出力イメージになる場合、関数 imtransform は自動的に 'XYScale' を増加します。出力ピクセル スケールと入力ピクセル スケールが一致することを確認するには、'XYScale' パラメーターを指定します。たとえば、次の構文に示すように、imtransform を呼び出します。

    B = imtransform(A,T,'XYScale',1)

'Size'

出力イメージ B の行数と列数を指定する非負整数の 2 要素ベクトル。高次元の場合、imtransformB のサイズを A のサイズから直接取得します。したがって、k > 2 の場合、size(B,k)size(A,k) と同じになります。

既定値: 'Size' を指定しない場合、imtransform は、'XData''YData'、および 'XYScale' からこの値を得ます。

'FillValues'

1 つ、または、いくつかの塗りつぶしの値を含む配列。関数 imtransform は、入力イメージと対応する変換された位置が、入力イメージ境界の外に完全に移動する場合の出力ピクセルに対する塗りつぶしの値を使用します。A が 2 次元の場合、'FillValues' は、スカラーになります。ただし、A の次元が 2 より高くなる場合、'FillValues' は、以下の制約を満たす配列のサイズになるように指定します。size(fill_values,k) は、size(A,k+2) または 1 のいずれかでなければなりません。

たとえば、A が、200 × 200 × 3 の uint8 の RGB イメージの場合、'FillValues' に対して可能な値は、以下のとおりです。

塗りつぶし
0黒で塗りつぶす
[0;0;0]黒で塗りつぶす
255白で塗りつぶす
[255;255;255]白で塗りつぶす
[0;0;255]青で塗りつぶす
[255;255;0]黄色で塗りつぶす

A がサイズ 200 × 200 × 3 × 10 の 4 次元配列の場合、'FillValues' は、1 行 10 列、3 行 1 列、3 行 10 列またはスカラーになります。

出力引数

B

任意の非スパース数値クラス (実数または複素数) または logical クラスの出力イメージ。

xdata

B の最初の列と最後の列の x 座標を指定する 2 要素ベクトル。

    メモ:   出力値 xdataydata は、入力 'XData''YData' 引数と厳密には一致しない場合があります。この値は、整数値や行と列に対して、または完全に一致しない 'XData''YData''XYScale'、および 'Size' に対する値が指定されている場合のいずれかで異なります。いずれかの場合、xdataydata の最初の要素は、'XData''YData' の最初のそれぞれの要素と常に等しくなります。xdataydata の 2 番目の要素だけが、異なる可能性があります。

ydata

B の最初の行と最後の行の y 座標を指定する 2 要素ベクトル。

"単純な変換"。強度イメージに水平的なせん断を適用します。

I = imread('cameraman.tif');
tform = maketform('affine',[1 0 0; .5 1 0; 0 0 1]);
J = imtransform(I,tform);
imshow(I), figure, imshow(J)

水平的なせん断

射影変換。射影変換によって、正方形を四辺形にマッピングします。

% Set up an input coordinate system so that the input image 
% fills the unit square with vertices (0 0),(1 0),(1 1),(0 1).
I = imread('cameraman.tif');
udata = [0 1];  vdata = [0 1];

% Transform to a quadrilateral with vertices (-4 2),(-8 3),
% (-3 -5),(6 3).
tform = maketform('projective',[ 0 0;  1  0;  1  1; 0 1],...
                               [-4 2; -8 -3; -3 -5; 6 3]);

% Fill with gray and use bicubic interpolation. 
% Make the output size the same as the input size.

[B,xdata,ydata] = imtransform(I, tform, 'bicubic', ...
                              'udata', udata,...
                              'vdata', vdata,...
                              'size', size(I),...
                              'fill', 128);
subplot(1,2,1), imshow(I,'XData',udata,'YData',vdata), ...
   axis on 
subplot(1,2,2), imshow(B,'XData',xdata,'YData',ydata), ...
   axis on 

射影変換

"イメージのレジストレーション"。航空写真から正射写真へのレジストレーションを行います。

航空写真を MATLAB ワークスペースに読み取って表示します。

unregistered = imread('westconcordaerial.png');
figure, imshow(unregistered)

航空写真

正射写真を MATLAB ワークスペースに読み取って表示します。

figure, imshow('westconcordorthophoto.png')

正射写真

以前に選択したコントロール ポイントを読み込みます。

load westconcordpoints

ポイントを使用して、射影変換の変換構造体を作成します。

t_concord = cp2tform(movingPoints,fixedPoints,'projective');

正射写真の幅と高さを取得し、変換を実行して、結果を表示します。

info = imfinfo('westconcordorthophoto.png');

registered = imtransform(unregistered,t_concord,...
    'XData',[1 info.Width], 'YData',[1 info.Height]);
figure, imshow(registered)

変換されたイメージ

ヒント

  • "イメージのレジストレーション"。関数 imtransform は、出力イメージの原点を自動的にシフトして、変換されたイメージをできるだけ見やすくします。imtransform を使用してイメージのレジストレーションを実行すると、構文 B = imtransform(A,tform) では、予想どおりの結果が得られない場合があります。出力イメージの空間的な位置を制御するには、'XData''YData' を明示的に設定します。

  • "平行移動のみ"。純粋に平行移動のみを行う変換によって関数 imtransform を呼び出すと、imtransform の呼び出し時に 'XData' 値と 'YData' 値を指定していない場合、入力イメージとまったく同じ出力イメージが生成されます。たとえば、入力イメージに関連する平行移動を示し、出力と入力のサイズを同じ大きさにする場合、次の構文に示すように imtransform を呼び出します。

    B = imtransform(A,T,'XData',[1 size(A,2)],...
       'YData',[1 size(A,1)])
    

    このトピックについての詳細は、「シンプルな 2 次元平行移動変換の実行」を参照してください。

  • "変換速度"。'XData''YData' を使用して、B に対する出力空間の位置を設定していない場合、imtransform は、関数 findbounds を使用して、自動的に位置を決定します。アフィン変換や射影変換など、いくつかの一般的に使われる変換に対して、高速フォワード マッピングのオプションとして findbounds を使用できます。フォワード マッピングを行わない変換、たとえば、fitgeotrans で計算される多項式変換に対して、findbounds はかなりの時間を要します。このような変換に対して 'XData''YData' を直接指定できる場合、imtransform は、かなり高速になります。

  • "クリッピング"。findbounds を使用した 'XData''YData' の自動推定によって、出力イメージがクリッピングされる場合があります。クリッピングを防止するには、'XData''YData' を直接設定します。

  • "任意の次元変換"。imtransform を使用する場合、tform の 2 次元変換を使用します。任意の次元配列変換に対しては、tformarray を参照してください。

R2006a より前に導入

この情報は役に立ちましたか?