ドキュメンテーション

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

変換イメージのギャラリーを作成

この例では、チェッカーボード イメージにさまざまな変換を適用することによって、幾何学的変換の多くの特性を示します。

概要

2 次元の幾何学的変換は、ユークリッド平面の各ポイントをユークリッド平面の別のポイントに関連付けるマッピングです。以下の例では、幾何学的変換は、直交座標 (x,y) を使用したポイントを直交座標 (u,v) を使用した別のポイントにマッピングする方法を示す規則によって定義されます。チェッカーボード パターンは、入力イメージの平面における座標格子と、各変換によって発生する歪みのタイプを可視化するのに役立ちます。

イメージ 1: チェッカーボードの作成

checkerboard は四角形のタイルと 4 つの固有の角をもつイメージを生成します。このイメージにより、幾何学的変換によってチェッカーボードのイメージがどのように変化するかが簡単にわかります。

この例を 1 回実行した後に、イメージ I を大きなチェッカーボードまたは好みのイメージに変えてみます。

I = checkerboard(10,2);
imshow(I)
title('original')

イメージ 2: チェッカーボードに無反射相似を適用

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

無反射相似の場合、

$$[\begin{array}{c c}u\ v\end{array}] = [\begin{array}{c c}x\ y\ 1\end{array}]\,T$$

T は 4 つのパラメーターに依存する 3 行 3 列の行列です。

% Try varying these 4 parameters.
scale = 1.2;       % scale factor
angle = 40*pi/180; % rotation angle
tx = 0;            % x translation
ty = 0;            % y translation

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

T = [ sc -ss  0;
      ss  sc  0;
      tx  ty  1];

無反射相似はアフィン変換の一部であるため、以下を使用して affine2d オブジェクトを作成します。

t_nonsim = affine2d(T);
I_nonreflective_similarity = imwarp(I,t_nonsim,'FillValues',.3);

figure, imshow(I_nonreflective_similarity);
title('nonreflective similarity')

平行移動について: tx または ty をゼロ以外の値に変更した場合、出力イメージには何の影響もないことがわかります。平行移動を含む、変換に対応する座標を表示する場合は、次を実行します。

[I_nonreflective_similarity,RI] = imwarp(I,t_nonsim,'FillValues',.3);

figure, imshow(I_nonreflective_similarity,RI)
axis on
title('nonreflective similarity')

imwarp から出力空間参照オブジェクト RI を渡すことで平行移動の情報が表示されます。表示する出力イメージの部分を指定するには、関数 imwarp で 'OutputView' の名前と値のペアを使用します。

イメージ 3: チェッカーボードに相似を適用

相似変換では、三角形は相似する三角形にマッピングされます。無反射相似変換は、相似変換の一部です。

相似では、方程式は無反射相似の場合と同じです。

$$[\begin{array}{c c}u\ v\end{array}] = [\begin{array}{c c}x\ y\ 1\end{array}]\,T$$

T は、4 つのパラメーターとオプションの反射に依存する 3 行 3 列の行列です。

% Try varying these parameters.
scale = 1.5;        % scale factor
angle = 10*pi/180; % rotation angle
tx = 0;            % x translation
ty = 0;            % y translation
a = -1;            % -1 -> reflection, 1 -> no reflection

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

T = [   sc   -ss  0;
      a*ss  a*sc  0;
        tx    ty  1];

相似はアフィン変換の一部であるため、以下を使用して affine2d オブジェクトを作成します。

t_sim = affine2d(T);

% As in the translation example above, retrieve the output spatial
% referencing object |RI| from the |imwarp| function, and pass |RI| to
% |imshow| to reveal the reflection.
[I_similarity,RI] = imwarp(I,t_sim,'FillValues',.3);

figure, imshow(I_similarity,RI)
axis on
title('similarity')

イメージ 4: チェッカーボードにアフィン変換を適用

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

アフィン変換では、方程式は相似および無反射相似の場合と同じです。

$$[\begin{array}{c c}u\ v\end{array}] = [\begin{array}{c c}x\ y\ 1\end{array}]\,T$$

T は 3 行 3 列の行列で、1 列目と 2 列目の 6 つの要素はすべて異なるものにすることができます。3 番目の列は [0;0;1] でなければなりません。

% Try varying the definition of T.
T = [1  0.3  0;
     1    1  0;
     0    0  1];
t_aff = affine2d(T);
I_affine = imwarp(I,t_aff,'FillValues',.3);

figure, imshow(I_affine)
title('affine')

イメージ 5: チェッカーボードに射影変換を適用

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

射影変換の場合:

$$[\,\begin{array}{c c}up\ vp\ wp\end{array}\,] = [\,\begin{array}{c c}x\ y\ w\end{array}\,]\,T$$

$$u = \frac{up}{wp}$$

$$v = \frac{vp}{wp}$$

T は 3 行 3 列の行列で、9 つの要素はすべて異なります。

$$T = \left[\begin{array}{c c c}A\;D\;G\\B\;E\;H\\C\;F\;I\end{array}\right]$$

上記の行列方程式は、下の 2 つの式に相当します。

$$u = \frac{Ax + By + C}{Gx + Hy + I}$$

$$v = \frac{Dx + Ey + F}{Gx + Hy + I}$$

T の 9 つの要素のいずれかを変えて試してみます。

T = [1  0  0.008;
     1  1  0.01;
     0  0  1   ];
t_proj = projective2d(T);
I_projective = imwarp(I,t_proj,'FillValues',.3);

figure, imshow(I_projective)
title('projective')

イメージ 6: チェッカーボードに多項式変換を適用

多項式変換では、x と y の多項式がマッピングを定義します。

2 次多項式変換では、次のように定義します。

$$[\begin{array}{c c}u\ v\end{array}] = [\begin{array}{c c} 1\ x\ y\ x*y\ x^2\ y^2\end{array}]\,T$$

u と v は共に、x と y の 2 次多項式です。2 次多項式はそれぞれ 6 つの項があります。

fixedPoints  = reshape(randn(12,1),6,2);
movingPoints = fixedPoints;
t_poly = fitgeotrans(movingPoints,fixedPoints,'polynomial',2);
I_polynomial = imwarp(I,t_poly,'FillValues',.3);

figure, imshow(I_polynomial)
title('polynomial')

イメージ 7: チェッカーボードに区分的線形変換を適用

区分的線形変換では、イメージの個々の三角形領域にアフィン変換が適用されます。この例では、イメージの左上の三角形領域は変更されませんが、イメージの右下の三角形領域が引き伸ばされます。

movingPoints = [10 10; 10 30; 30 30; 30 10];
fixedPoints  = [10 10; 10 30; 40 35; 30 10];
t_piecewise_linear = fitgeotrans(movingPoints,fixedPoints,'pwl');
I_piecewise_linear = imwarp(I,t_piecewise_linear);

figure, imshow(I_piecewise_linear)
title('piecewise linear')

イメージ 8: チェッカーボードに正弦変換を適用

次の例とそれに続く 2 つの例では、明示的なマッピング tmap_b を作成して、等間隔グリッドの各ポイント (xi,yi) を別のポイント (u,v) に関連付ける方法を示します。このマッピング tmap_btformarray が使用してイメージを変換します。

% locally varying with sinusoid
[nrows,ncols] = size(I);
[xi,yi] = meshgrid(1:ncols,1:nrows);
a1 = 5; % Try varying the amplitude of the sinusoids.
a2 = 3;
imid = round(size(I,2)/2); % Find index of middle element
u = xi + a1*sin(pi*xi/imid);
v = yi - a2*sin(pi*yi/imid);
tmap_B = cat(3,u,v);
resamp = makeresampler('linear','fill');
I_sinusoid = tformarray(I,[],resamp,[2 1],[1 2],[],tmap_B,.3);

figure, imshow(I_sinusoid)
title('sinusoid')

イメージ 9: チェッカーボードに樽形変換を適用

樽形歪曲はイメージを中心から外側に放射状に変形します。歪みは中心から遠ざかるほど大きくなり、側面が凸状になります。

% radial barrel distortion
xt = xi(:) - imid;
yt = yi(:) - imid;
[theta,r] = cart2pol(xt,yt);
a = .001; % Try varying the amplitude of the cubic term.
s = r + a*r.^3;
[ut,vt] = pol2cart(theta,s);
u = reshape(ut,size(xi)) + imid;
v = reshape(vt,size(yi)) + imid;
tmap_B = cat(3,u,v);
I_barrel = tformarray(I,[],resamp,[2 1],[1 2],[],tmap_B,.3);

figure, imshow(I_barrel)
title('barrel')

イメージ 10: チェッカーボードにピン クッション変換を適用

ピンクッション歪曲は、3 次方程式に負の偏角があるため樽形歪曲の逆になります。歪みは中心から遠ざかるほど大きくなり、側面が凹状になります。

% radial pin cushion distortion
xt = xi(:) - imid;
yt = yi(:) - imid;
[theta,r] = cart2pol(xt,yt);
a = -.0005; % Try varying the amplitude of the cubic term.
s = r + a*r.^3;
[ut,vt] = pol2cart(theta,s);
u = reshape(ut,size(xi)) + imid;
v = reshape(vt,size(yi)) + imid;
tmap_B = cat(3,u,v);
I_pin = tformarray(I,[],resamp,[2 1],[1 2],[],tmap_B,.3);

figure, imshow(I_pin)
title('pin cushion')

まとめ: チェッカーボードの幾何学的変換をすべて表示

figure
subplot(5,2,1),imshow(I),title('original')
subplot(5,2,2),imshow(I_nonreflective_similarity),title('nonreflective similarity')
subplot(5,2,3),imshow(I_similarity),title('similarity')
subplot(5,2,4),imshow(I_affine),title('affine')
subplot(5,2,5),imshow(I_projective),title('projective')
subplot(5,2,6),imshow(I_polynomial),title('polynomial')
subplot(5,2,7),imshow(I_piecewise_linear),title('piecewise linear')
subplot(5,2,8),imshow(I_sinusoid),title('sinusoid')
subplot(5,2,9),imshow(I_barrel),title('barrel')
subplot(5,2,10),imshow(I_pin),title('pin cushion')

表示されているイメージのスケールは subplot によって変更されています。

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