ドキュメンテーション

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

imtransform

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

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

説明

B = imtransform(A,tform) は、tform で定義された 2 次元空間変換に従ってイメージ A を変換し、変換されたイメージ B を返します。

A がカラー イメージの場合、imtransform は同じ 2 次元変換を各カラー チャネルに適用します。同様に、A が 3 次元以上のボリュームまたはイメージ シーケンスの場合、imtransform は同じ 2 次元変換を、より高い次元に沿って、すべての 2 次元平面に適用します。任意次元の配列変換の場合は、tformarray を使用します。

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

B = imtransform(___,Name,Value) は、空間変換のさまざまな特性を制御する名前と値のペアを使用します。

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

単純な変換

グレースケール イメージに水平的なせん断を適用します。

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

射影変換

射影変換によって、正方形を四辺形にマッピングします。入力イメージが、頂点 (0 0)、(1 0)、(1 1)、(0 1) を持つ単位正方形を塗りつぶすように、入力座標系を設定します。

I = imread('cameraman.tif');
udata = [0 1];  vdata = [0 1];

頂点 (-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]);

灰色に塗りつぶして、双三次内挿を使用します。出力サイズを入力サイズと同じにします。

[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)
subplot(1,2,2); imshow(B,'XData',xdata,'YData',ydata)

イメージのレジストレーション

航空写真を 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)

入力引数

すべて折りたたむ

変換されるイメージ。任意の次元の数値配列または logical 配列として指定します。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | 論理値

変換構造体。maketform または cp2tform などによって返される struct として指定します。変換の最初の次元は、水平方向または x 座標で、2 番目の次元は、垂直方向または y 座標です。この表現は、MATLAB の配列添字の表現の逆になっています。

内挿法。次のいずれかの値に指定します。

内挿法説明
'bilinear'線形内挿
'nearest'最近傍内挿 — 出力ピクセルには、対象の点が含まれるピクセルの値が代入されます。周りの他のピクセルは、考慮に入れません。
'bicubic'3 次内挿
resampler 構造体makeresampler によって返される resampler 構造体。このオプションは、imtransform によるリサンプリングの方法をより制御可能にします。

データ型: char

名前と値のペアの引数

オプションの引数 Name,Value のコンマ区切りペアを指定します。Name は引数名で、Value は対応する値です。Name は引用符で囲まなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペアの引数を、任意の順番で指定できます。

例: B = imtransform(A,T,'FillValues',128)

U-V 入力空間における入力イメージ A の空間範囲。2 要素の数値ベクトルとして指定します。UDataVData の値は、ワールド座標系での座標を表します。UData の 2 つの要素は、それぞれ A の最初と最後の列の u 座標 (水平) を与えます。VData の 2 つの要素は、A の最初と最後の行の v 座標 (垂直) を与えます。

既定では、U-V 空間における A の空間範囲は、固有座標におけるイメージ範囲と同じです。つまり、UData の既定値は [1 size(A,2)] で、VData の既定値は [1 size(A,1)] です。

X-Y 入力空間における変換後のイメージ B の空間範囲。2 要素の数値ベクトルとして指定します。XDataYData の値は、ワールド座標系での座標を表します。XData の 2 つの要素は、B の最初と最後の列の x 座標 (垂直座標) を与えます。YData の 2 つの要素は、B の最初と最後の行の y 座標 (垂直) を与えます。

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

X-Y 出力空間でのピクセルのサイズ。数値スカラーまたは 2 要素数値ベクトルとして指定します。XYScale がスカラーの場合、出力ピクセルは正方形であり、XYScale は辺の長さを指定します。それ以外の場合、XYScale の 2 つの要素は、それぞれ、X-Y 空間での各出力ピクセルの幅と高さを指定します。

XYScale の既定値は、Size を指定するかどうかによって異なります。

  • Size を指定した場合、imtransform は、SizeXData、および YData から XYScale を計算します。

  • Size を指定しない場合、imtransform は、大きすぎる出力イメージになる場合を除いて、XYScale の入力ピクセルのスケールを使用します。

メモ

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

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

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

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

入力イメージの境界外にある出力ピクセルに使用する塗りつぶしの値。'FillValues' と数値スカラーまたは数値配列で構成されるコンマ区切りのペアとして指定します。塗りつぶしの値は、入力イメージにおける対応する逆変換後の位置が完全に入力イメージの境界外である場合に、出力ピクセルに使用されます。

  • 入力イメージ A が 2 次元である場合、FillValues はスカラーでなければなりません。

  • A が 3 次元または N 次元の場合、FillValues は、サイズが以下の制約を満たす配列にします。size(FillValues,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 列の行列を指定できます。

出力引数

すべて折りたたむ

変換後のイメージ。入力イメージ A と同じ次元の数値配列または logical 配列として返されます。

X-Y 出力空間における変換後のイメージ B の水平方向範囲。2 要素の数値ベクトルとして返されます。xdata の 2 つの要素は、ワールド座標系における B の最初と最後の列の x 座標 (水平) を与えます。

メモ

xdata の最初の要素は、指定した場合、引数 XData の最初の要素と常に等しくなります。ただし、xdata の 2 番目の要素は、XData の 2 番目の要素と厳密には等しくない場合があります。この値は、行と列には整数値が必要であるため、または指定した XDataYDataXYScale、および Size の値が完全に一致していないためのいずれかの理由で異なります。

X-Y 出力空間における変換後のイメージ B の垂直方向範囲。2 要素の数値ベクトルとして返されます。ydata の 2 つの要素は、ワールド座標系における B の最初と最後の行の y 座標 (垂直座標) を与えます。

メモ

ydata の最初の要素は、指定した場合、引数 YData の最初の要素と常に等しくなります。ただし、ydata の 2 番目の要素は、YData の 2 番目の要素と厳密には等しくない場合があります。この値は、行と列には整数値が必要であるため、または指定した XDataYDataXYScale、および Size の値が完全に一致していないためのいずれかの理由で異なります。

ヒント

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

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

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

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

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

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

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

R2006a より前に導入