ドキュメンテーション

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

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

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

概要

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

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

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

この例を 1 回実行した後に、イメージ I を好みのイメージに変えてみます。

sqsize = 60;
I = checkerboard(sqsize,4,4);
nrows = size(I,1);
ncols = size(I,2);
fill = 0.3;

imshow(I)
title('Original')

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

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

無反射相似の場合、

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',fill);

imshow(I_nonreflective_similarity);
title('Nonreflective Similarity')

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

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

imshow(I_nonreflective_similarity,RI)
axis on
title('Nonreflective Similarity (Spatially Referenced)')

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

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

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

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

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);

上記の平行移動の例と同様に、関数 imwarp から出力空間参照オブジェクト RI を取得して、RIimshow に渡すことで鏡映の情報が表示されます。

[I_similarity,RI] = imwarp(I,t_sim,'FillValues',fill);

imshow(I_similarity,RI)
axis on
title('Similarity')

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

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

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

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',fill);

imshow(I_affine)
title('Affine')

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

射影変換では、四角形は四角形にマッピングされます。直線は直線のままですが、平行線は必ずしも平行のままではありません。アフィン変換は射影変換の一部です。

射影変換の場合:

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

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

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

T = [1  0  0.002; 
     1  1  0.0002;
     0  0  1   ];
t_proj = projective2d(T);   

I_projective = imwarp(I,t_proj,'FillValues',fill);
imshow(I_projective)
title('Projective')

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

区分的線形変換では、イメージの個々の領域にアフィン変換が適用されます。この例では、チェッカーボードの左上、右上、左下のポイントは変化しませんが、変換後のイメージの右下隅が元の座標から右側に 50%、下側に 20% 移動するように、イメージの右下の三角形領域が引き伸ばされます。

movingPoints = [0 0; 0 nrows; ncols 0; ncols nrows;]; 
fixedPoints  = [0 0; 0 nrows; ncols 0; ncols*1.5 nrows*1.2]; 
t_piecewise_linear = fitgeotrans(movingPoints,fixedPoints,'pwl'); 

I_piecewise_linear = imwarp(I,t_piecewise_linear,'FillValues',fill);
imshow(I_piecewise_linear)
title('Piecewise Linear')

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

次の例とそれに続く 2 つの例では、明示的なマッピングを作成して、等間隔グリッドの各ポイント (xi,yi) を別のポイント (ui,vi) に関連付ける方法を説明します。このマッピングは geometricTranform2d オブジェクトに格納され、imwarp によってイメージの変換に使用されます。

この正弦変換では、各ピクセルの x 座標は変化しません。ピクセルの各行の y 座標は、正弦波パターンに従って上または下にシフトします。

a = ncols/12; % Try varying the amplitude of the sinusoid
ifcn = @(xy) [xy(:,1), xy(:,2) + a*sin(2*pi*xy(:,1)/nrows)];
tform = geometricTransform2d(ifcn);

I_sinusoid = imwarp(I,tform,'FillValues',fill);
imshow(I_sinusoid);
title('Sinusoid')

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

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

まず、ピクセルのインデックスを中心からの距離にマッピングする関数を定義します。関数 meshgrid を使用し、イメージの左上隅を原点として、各ピクセルの x 座標と y 座標の配列を作成します。

[xi,yi] = meshgrid(1:ncols,1:nrows);

原点をイメージの中心にシフトします。次に、関数 cart2pol を使用して、x および y 直交座標を円柱座標の角度 (theta) および半径 (r) の座標に変換します。r は、中心ピクセルからの距離の増加に従って線形に変化します。

xt = xi - ncols/2;
yt = yi - nrows/2;
[theta,r] = cart2pol(xt,yt);

3 次項の振幅 a を定義します。このパラメーターは調整できます。次に、r に 3 次項を加算し、r が中心ピクセルからの距離によって非線形に変化するようにします。

a = 1; % Try varying the amplitude of the cubic term.
rmax = max(r(:));
s1 = r + r.^3*(a/rmax.^2);

直交座標系に変換し直します。原点をイメージの右上隅に再シフトします。

[ut,vt] = pol2cart(theta,s1);
ui = ut + ncols/2;
vi = vt + nrows/2;

(xi,yi) と (ui,vi) の間のマッピングを geometricTranform2d オブジェクトに格納します。imwarp を使用して、ピクセルのマッピングに従ってイメージを変換します。

ifcn = @(c) [ui(:) vi(:)];
tform = geometricTransform2d(ifcn);

I_barrel = imwarp(I,tform,'FillValues',fill);
imshow(I_barrel)
title('Barrel')

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

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

樽形変換と同じ theta および r の値で始めることができます。3 次項の別の振幅 b を定義します。このパラメーターは調整できます。次に、r の 3 次項を減算し、r が中心ピクセルからの距離に対して非線形に変化するようにします。

b = 0.4; % Try varying the amplitude of the cubic term.
s = r - r.^3*(b/rmax.^2);

直交座標系に変換し直します。原点をイメージの右上隅に再シフトします。

[ut,vt] = pol2cart(theta,s);
ui = ut + ncols/2;
vi = vt + nrows/2;

(xi,yi) と (ui,vi) の間のマッピングを geometricTranform2d オブジェクトに格納します。imwarp を使用して、ピクセルのマッピングに従ってイメージを変換します。

ifcn = @(c) [ui(:) vi(:)];
tform = geometricTransform2d(ifcn);
I_pin = imwarp(I,tform,'FillValues',fill);
imshow(I_pin)
title('Pin Cushion')

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

figure
subplot(3,3,1),imshow(I),title('Original')
subplot(3,3,2),imshow(I_nonreflective_similarity),title('Nonreflective Similarity')
subplot(3,3,3),imshow(I_similarity),title('Similarity')
subplot(3,3,4),imshow(I_affine),title('Affine')
subplot(3,3,5),imshow(I_projective),title('Projective')
subplot(3,3,6),imshow(I_piecewise_linear),title('Piecewise Linear')
subplot(3,3,7),imshow(I_sinusoid),title('Sinusoid')
subplot(3,3,8),imshow(I_barrel),title('Barrel')
subplot(3,3,9),imshow(I_pin),title('Pin Cushion')

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

参考

関数

オブジェクト

関連するトピック