ドキュメンテーション

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

cp2tform

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

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

構文

TFORM = cp2tform(movingPoints,fixedPoints, transformtype)
TFORM = cp2tform(CPSTRUCT, transformtype)
[TFORM, movingPoints, fixedPoints] = cp2tform(CPSTRUCT, ...)
TFORM = cp2tform(movingPoints,fixedPoints, 'polynomial', order)
TFORM = cp2tform(CPSTRUCT,'polynomial',order)
TFORM = cp2tform(movingPoints,fixedPoints,'piecewise linear')
TFORM = cp2tform(CPSTRUCT,'piecewise linear')
TFORM = cp2tform(movingPoints,fixedPoints,'lwm', N)
TFORM = cp2tform(CPSTRUCT, 'lwm', N)
[TFORM, movingPoints, fixedPoints, movingPoints_bad, fixedPoints_bad] = cp2tform(movingPoints, fixedPoints, 'piecewise linear')
[TFORM, movingPoints, fixedPoints, movingPoints_bad, fixedPoints_bad] = cp2tform(CPSTRUCT, 'piecewise linear')

説明

TFORM = cp2tform(movingPoints,fixedPoints, transformtype) はコントロール ポイントの組から空間変換を推測し、この変換を TFORM 構造体として返します。

TFORM = cp2tform(CPSTRUCT, transformtype) は、入力イメージとベース イメージに対するコントロール ポイント行列を含む構造体 CPSTRUCT に対して機能します。コントロール ポイント選択ツールである cpselect によって CPSTRUCT が作成されます。

[TFORM, movingPoints, fixedPoints] = cp2tform(CPSTRUCT, ...) は、movingPointsfixedPoints で使用されたコントロール ポイントを返します。一致しない点や予測点は使用されません。cpstruct2pairs を参照してください。

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

TFORM = cp2tform(CPSTRUCT,'polynomial',order) は構造体 CPSTRUCT に対して機能します。

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

TFORM = cp2tform(CPSTRUCT,'piecewise linear') は構造体 CPSTRUCT に対して機能します。

TFORM = cp2tform(movingPoints,fixedPoints,'lwm', N) は近傍のコントロール ポイントを使用して、各コントロール ポイントで多項式を推定し、マッピングを行います。任意の位置でのマッピングは、これらの多項式の加重平均に依存します。オプションで、各多項式の推定に使用されるポイントの数 N を指定できます。N 個の最近傍点が、コントロール ポイントの各組に対して次数 2 の多項式を推測するために使用されます。N を省略すると、既定値の 12 に設定されます。N には最小で 6 を指定できますが、N の値を小さくすると条件の悪い多項式が生成される可能性があります。

TFORM = cp2tform(CPSTRUCT, 'lwm', N) は構造体 CPSTRUCT に対して機能します。

[TFORM, movingPoints, fixedPoints, movingPoints_bad, fixedPoints_bad] = cp2tform(movingPoints, fixedPoints, 'piecewise linear') は、movingPointsfixedPoints で使用されたコントロール ポイントと、movingPoints_badfixedPoints_bad で重なった縮退三角形の中央の頂点であるために除去されたコントロール ポイントを返します。

[TFORM, movingPoints, fixedPoints, movingPoints_bad, fixedPoints_bad] = cp2tform(CPSTRUCT, 'piecewise linear') は構造体 CPSTRUCT. に対して機能します。

入力引数

movingPoints

m 行 2 列の double の行列で、変換するイメージのコントロール ポイントの x 座標と y 座標を含みます。

fixedPoints

m 行 2 列の double の行列で、ベース イメージのコントロール ポイントの x 座標と y 座標を含みます。

transformtype

推測する空間変換のタイプを指定します。関数 cp2tform で各変換タイプの構造体を推測するには、最小数のコントロール ポイントの組が必要です。次の表は、cp2tform によってサポートされているすべての変換タイプを複雑度の順にまとめています。'lwm''polynomial' の各変換タイプには、追加の parameter をオプションで指定できます。

 変換タイプ

CPSTRUCT

入力イメージとベース イメージのコントロール ポイント行列を含む構造体。CPSTRUCT を作成するには、コントロール ポイント選択ツール (cpselect) を使用します。

'polynomial',order

使用する多項式の順番を指定します。order には 2、3 または 4 を指定できます。

既定値: 3

'piecewise linear'

各区分に対して線形で連続ですが、連続的に微分可能ではありません。

'lwm'

局所的な加重平均。

N

ポイントの数。

出力引数

TFORM

空間変換を含む構造体

movingPoints

空間変換を推定するのに使用された入力コントロール ポイント。一致しない点や予測点は使用されません。

fixedPoints

空間変換を推定するのに使用されたベース コントロール ポイント。一致しない点や予測点は使用されません。

movingPoints_bad

外れ値であると判断されたため、除外された入力コントロール ポイント。

fixedPoints_bad

外れ値であると判断されたため、除外されたベース コントロール ポイント。

イメージを変換し、関数 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');
 
% Recover angle and scale by checking how a unit vector 
% parallel to the x-axis is rotated and stretched. 
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)

ヒント

  • 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 の場合、反射は変換に含まれません。

アフィン

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

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

[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. ベース コントロール ポイントの三角形分割を検出します。

  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 より前に導入

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