ドキュメンテーション

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

cp2tform

コントロール ポイントのペアから空間変換を推測

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

説明

tform = cp2tform(movingPoints,fixedPoints,transformationType) はコントロール ポイントのペアから空間変換を推測し、この変換を tform 構造体として返します。一部の変換タイプには、以下の構文で示すような追加パラメーターがオプションで存在します。

tform = cp2tform(movingPoints,fixedPoints,'polynomial',degree) では、多項式を使用する順番を指定できます。

tform = cp2tform(movingPoints,fixedPoints,'lwm',n) は近傍のコントロール ポイントを使用して、各コントロール ポイントで多項式を推定し、マッピングを行います。任意の位置でのマッピングは、これらの多項式の加重平均に依存します。オプションで、各多項式の推定に使用されるポイントの数 n を指定できます。n 個の最近傍点が、コントロール ポイントの各組に対して次数 2 の多項式を推測するために使用されます。

tform = cp2tform(movingPoints,fixedPoints,'piecewise linear') は、固定コントロール ポイントの Delaunay 三角形分割を作成し、対応する移動コントロール ポイントを固定コントロール ポイントにマッピングします。マッピングは各三角形に対して線形 (アフィン) で、コントロール ポイント間で連続的ですが、個々の三角形がそれ自身マッピングされたものになるため、連続的に微分可能ではありません。

[tform,usedMP,usedFP,badMP,badFP] = cp2tform(movingPoints,fixedPoints,'piecewise linear') は、区分的線形変換に使用されたコントロール ポイントを usedMPusedFP に返します。この構文は、重なった縮退三角形の中央の頂点であるために除去されたコントロール ポイントも badMPbadFP に返します。

tform = cp2tform(cpstruct,transformationType,___) は、cpstruct 構造体を使用して、移動イメージと固定イメージのコントロール ポイント座標を格納します。

[tform,usedMP,usedFP] = cp2tform(cpstruct,transformationType,___) は、変換に使用されたコントロール ポイントも usedMPusedFP に返します。一致しない点や予測点は使用されません。cpstruct2pairs を参照してください。

コントロール ポイントを使用した無反射相似変換構造体の作成

イメージを変換し、関数 cp2tform を使用して変換を返し、tform の角度とスケールと、元の変換の角度とスケールを比較します。

I = checkerboard;
J = imrotate(I,30);
fixedPoints = [11 11; 41 71];
movingPoints = [14 44; 70 81];
cpselect(J,I,movingPoints,fixedPoints);
 
t = cp2tform(movingPoints,fixedPoints,'nonreflective similarity');

x 軸に平行な単位ベクトルがどのように回転および伸長したかを確認することで、角度とスケールを復元します。

u = [0 1]; 
v = [0 0]; 
[x, y] = tformfwd(t,u,v); 
dx = x(2) - x(1); 
dy = y(2) - y(1); 
angle = (180/pi) * atan2(dy, dx) 
scale = 1 / sqrt(dx^2 + dy^2)

入力引数

すべて折りたたむ

移動イメージ内のコントロール ポイント。m 行 2 列の行列として指定します。各行は、コントロール ポイントの [x y] 座標を指定します。

例: [11 11; 41 71]

データ型: double

固定イメージ内のコントロール ポイント。m 行 2 列の行列として指定します。各行は、コントロール ポイントの [x y] 座標を指定します。

例: [14 44; 70 81]

データ型: double

変換タイプ。次のいずれかを指定します。複雑度が増える順でリストされています。関数 cp2tform で各変換タイプの構造体を推測するには、最小数のコントロール ポイントのペアが必要です。

変換タイプ

説明

コントロール ポイントのペアの最小数

'nonreflective similarity'

移動イメージ内の形状は変更されていないが、平行移動、回転、およびスケーリングの組み合わせによってイメージの歪みが生じている場合は、この変換を使用します。直線は直線のまま、平行線は平行のままです。

2

'similarity'

'nonreflective similarity' にオプションの鏡映が追加されたものと同じです。

3

'affine'

移動イメージ内の形状がせん断を示す場合は、この変換を使用します。直線は直線のまま、平行線は平行のままですが、四角形は平行四辺形になります。

3

'projective'

シーンが傾いて見える場合は、この変換を使用します。直線は直線のままですが、平行線は消失点に向かって収束していきます。消失点はイメージ内にあるとは限りません。

4

'polynomial'

イメージ内のオブジェクトが湾曲している場合は、この変換を使用します。多項式の次数が高いほど、近似度も高くなりますが、結果に含まれる曲線の数が固定イメージより多くなる場合があります。

多項式の degree を指定できます。

6 (2 次)

10 (3 次)

15 (4 次)

'piecewise linear'

イメージの部分ごとに異なる歪みがあるように見える場合は、この変換を使用します。

4

'lwm'

歪みが局所的に変化し、区分的な線形が十分でない場合は、この変換を使用します。

局所重み付き平均の計算に使用する点の数 n を指定できます。

6 (12 を推奨)

データ型: char

あらかじめ選択したコントロール ポイント。構造体として指定します。cpstruct には、移動イメージと固定イメージのすべてのコントロール ポイント (ペアになっていないコントロール ポイントや予測したコントロール ポイントを含む) の x 座標と y 座標に関する情報が含まれています。cpstruct2pairs は、不一致のコントロール ポイントや予測したコントロール ポイントを除去し、有効なコントロール ポイントのペアを返します。

[ワークスペースにポイントをエクスポート] オプションを選択した場合、cpstruct はコントロール ポイント選択ツール (cpselect) で生成される構造体です。詳細は、コントロール ポイントのワークスペースへのエクスポートを参照してください。

データ型: struct

多項式変換の次数。整数 23 または 4 として指定します。

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

局所重み付き平均の計算に使用する点の数。正の整数として指定します。n には最小で 6 を指定できますが、n の値を小さくすると条件の悪い多項式が生成される可能性があります。

出力引数

すべて折りたたむ

変換。struct として返されます。

空間変換の推定に使用された移動コントロール ポイント。n 行 2 列の行列として返されます。一致しない点や予測点は使用されません。

空間変換の推定に使用された固定コントロール ポイント。n 行 2 列の行列として返されます。一致しない点や予測点は使用されません。

外れ値であると判断されたため、除外された移動コントロール ポイント。p 行 2 列の行列として返されます。

外れ値であると判断されたため、除外された固定コントロール ポイント。p 行 2 列の行列として返されます。

ヒント

  • transformtype'nonreflective similarity''similarity''affine''projective' または 'polynomial' であり、特定の変換に必要な最小数のコントロール ポイントが movingPointsfixedPoints (または cpstruct) にある場合、cp2tform は係数を正確に検出します。

  • movingPointsfixedPoints に最小数より多いコントロール ポイントがある場合は、最小二乗解が求められます。mldivide を参照してください。

  • movingPoints または fixedPoints の原点に対して (値の範囲と比較して) 大きなオフセットがある場合、cp2tform は境界ボックスの中心が原点と重なるように点をシフトさせてから、tform 構造体を近似します。この処理は数値的な安定性を高めるものであり、座標のシフトを必要に応じて自動的に適用したり元に戻したりするカスタム tform の内部に原点を中心とした tform をラップすることによって透過的に行われます。このため、変換タイプが同じでも、座標入力が異なれば fields(T) の出力結果は異なる場合があります。

アルゴリズム

すべて折りたたむ

cp2tform では、次の一般的な処理が使用されます。

  1. コントロール ポイントの有効な組を使って、出力空間 (x,y) から入力空間 (x,y) への空間変換または逆マッピングを transformtype に従って推測します。

  2. 空間変換を含む構造体 tform を返します。

この処理は transformtype によって異なります。

非鏡映相似

非鏡映相似変換には、回転、スケーリング、平行移動が含まれます。形状と角度は保持されます。平行線は平行のままです。直線は直線のままです。

次のように仮定します。

sc = scale*cos(angle)
ss = scale*sin(angle)

[u v] = [x y 1] * [ sc -ss
                    ss  sc
                    tx  ty]

scsstx、および ty の解を求めます。

相似

相似変換には回転、スケーリング、平行移動、鏡映が含まれます。形状と角度は保持されます。平行線は平行のままです。直線は直線のままです。

次のように仮定します。

sc = s*cos(theta)
ss = s*sin(theta)

                   [ sc -a*-ss
 [u v] = [x y 1] *   ss  a*sc
                     tx  ty]

scsstxty、および a の解を求めます。a = -1 の場合、鏡映は変換に含まれます。a = 1 の場合、鏡映は変換に含まれません。

アフィン

アフィン変換では、x と y の次元が個別にスケーリングまたはせん断されて、平行移動が行われます。平行線は平行のままです。直線は直線のままです。非鏡映相似変換はアフィン変換の一部です。

次のようなアフィン変換があるとします。

[u v] = [x y 1] * Tinv

Tinv は 3 行 2 列の行列です。Tinv の 6 個の要素の解を求めます。

t_affine = cp2tform(movingPoints,fixedPoints,'affine');

逆マッピングの係数は t_affine.tdata.Tinv に格納されます。

6 つの未知の係数を解くには、少なくとも 3 組のコントロール ポイントが必要です。

射影

射影変換では、四角形は四角形にマッピングされます。直線は直線のままです。アフィン変換は射影変換の一部です。

次のような射影変換があるとします。

[up vp wp] = [x y w] * Tinv

ここで、

u = up/wp 
v = vp/wp

Tinv は 3 行 3 列の行列です。

次のように仮定します。

Tinv = [ A D G;
         B E H;
         C F I ];
u = (Ax + By + C)/(Gx + Hy + I)
v = (Dx + Ey + F)/(Gx + Hy + I)

Tinv の 9 個の要素の解を求めます。

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

逆マッピングの係数は t_proj.tdata.Tinv に格納されます。

9 個の未知の係数を解くには、少なくとも 4 組のコントロール ポイントが必要です。

メモ

さらに、アフィン変換または射影変換は、3 行 2 列の Tinv の場合は以下のように表現できます。

[u v]'  =  Tinv' * [x y 1]' 

または、3 列 3 行の Tinv の場合は、以下のように表現できます。

[u v 1]'  =  Tinv' * [x y 1]'

多項式

多項式変換では、xy の多項式関数がマッピングを決定します。

2 次多項式

次のような 2 次多項式変換があるとします。

[u v] = [1  x  y  x*y  x^2  y^2] * Tinv

uv はいずれも xy の 2 次多項式です。2 次多項式にはそれぞれ 6 つの項があります。すべての係数を指定するために、Tinv のサイズは 6 行 2 列です。

t_poly_ord2 = cp2tform(movingPoints,fixedPoints,'polynomial');

逆マッピングの係数は t_poly_ord2.tdata に格納されます。

12 個の未知の係数を解くには、少なくとも 6 組のコントロール ポイントが必要です。

3 次多項式

次のような 3 次多項式変換があるとします。

[u v] = [1  x  y  x*y  x^2  y^2  y*x^2  x*y^2  x^3  y^3] * Tinv

uv はいずれも xy の 3 次多項式です。3 次多項式にはそれぞれ 10 個の項があります。すべての係数を指定するために、Tinv のサイズは 10 行 2 列です。

t_poly_ord3 = cp2tform(movingPoints, fixedPoints,'polynomial',3);

逆マッピングの係数は t_poly_ord3.tdata に格納されます。

20 個の未知の係数を解くには、少なくとも 10 組のコントロール ポイントが必要です。

4 次多項式

次のような 4 次多項式変換があるとします。

[u v] = [1 x y x*y x^2 y^2 y*x^2 x*y^2 x^3 y^3 x^3*y x^2*y^2 x*y^3 x^4 y^4] * Tinv

uv はいずれも xy の 4 次多項式です。4 次多項式にはそれぞれ 15 個の項があります。すべての係数を指定するために、Tinv のサイズは 15 行 2 列です。

t_poly_ord4 = cp2tform(movingPoints, fixedPoints,'polynomial',4);

逆マッピングの係数は t_poly_ord4.tdata に格納されます。

30 個の未知の係数を解くには、少なくとも 15 組のコントロール ポイントが必要です。

区分的線形

区分的線形変換では、イメージの各三角形領域に線形 (アフィン) 変換が個別に適用されます [1]

  1. 固定コントロール ポイントの Delaunay 三角形分割を検出します。

  2. 各三角形の 3 個の頂点を使用して、固定座標から移動座標へのアフィン マッピングを推測します。

メモ

少なくとも 4 組のコントロール ポイントが必要です。4 組を使用すると、個々のマッピングをもつ三角形が 2 つできます。

局所的な加重平均

fixedPoints 内の各コントロール ポイントに対して以下を行います。

  1. N 個の最近傍コントロール ポイントを検出します。

  2. これらの N 個の点と movingPoints 内の対応する点を使って、2 次多項式を推測します。

  3. 中心のコントロール ポイントから多項式を推測するために使用される最遠点までの距離として、多項式の影響半径を計算します (fixedPoints を使用)。[2]

メモ

2 次多項式を解くには、少なくとも 6 組のコントロール ポイントが必要です。使用する組が少なすぎると、条件の悪い多項式が生成される場合があります。

参照

[1] Goshtasby, Ardeshir, "Piecewise linear mapping functions for image registration," Pattern Recognition, Vol. 19, 1986, pp. 459-466.

[2] Goshtasby, Ardeshir, "Image registration by local approximation methods," Image and Vision Computing, Vol. 6, 1988, pp. 255-261.

R2006a より前に導入