MATLAB でのイメージへの幾何学的変換の適用
このチュートリアルでは、MATLAB で imwarp()
関数を使用して画像に幾何学的変換を適用する方法について説明します。
MATLAB でのイメージへの幾何学的変換の適用
幾何学的変換は、画像の回転、サイズ変更、せん断などの要件に従って画像を変換します。 MATLAB で imwarp()
関数を使用して、画像に幾何学的変換を適用できます。
画像は、特定の場所に配置されたピクセルで構成されます。 imwrap()
関数は、指定された変換オブジェクトに従ってピクセルの位置を変更します。
たとえば、画像を垂直方向に反転したい場合、画像に存在するピクセルの位置を変更するだけで済みます。 ピクセルの一番上の行は、指定された画像に存在するピクセルの最後の行と交換されます。
imwarp()
関数の基本的な構文を以下に示します。
output_image = imwarp(input_image, geo_tran);
上記の構文を使用して、指定された幾何学的変換 geo_tran
を入力画像 input_image
に適用できます。結果は output_image
内に保存されます。 入力イメージは、数値イメージ、論理イメージ、またはカテゴリカル イメージです。
MATLAB の affine2d()
関数を使用して、2D 幾何学的変換オブジェクトまたは行列を作成できます。 affine2d()
関数内で 3 行 3 列の行列を定義して変換オブジェクトを作成し、それを imwarp()
関数内に渡して指定された画像に適用する必要があります。
たとえば、MATLAB に既に保存されているカメラ画像を使用し、imwarp()
関数を使用して幾何学的変換を適用してみましょう。
以下のコードを参照してください。
clc
Img = imread('cameraman.tif');
imshow(Img)
gform = affine2d([1 0 0; .5 1 0; 1 0 1])
Jmg = imwarp(Img,gform);
figure
imshow(Jmg)
出力:
上記の出力では、右側の画像が変更されていることがわかります。唯一の変更はピクセルの位置です。 与えられた画像と関数から取得したい出力のタイプに応じて、変換行列を変更することもできます。
affine2d()
関数の詳細については、この リンク を確認してください。 3D 画像の幾何学的変換行列を作成する場合は、MATLAB の affine3d()
関数を使用できます。
affine3d()
の場合、入力行列は 4 行 4 列のサイズにする必要があります。 affine3d()
関数の詳細については、この リンク を確認してください。
イメージを N 度回転する
画像を回転するには、randomaffine2d()
関数を使用してランダム化された 2D アフィン変換オブジェクトを作成し、それを imwarp()
関数内の指定された画像と共に渡し、指定された画像に変換を適用します。 randomaffine2d()
関数の Rotation
引数を使用できます。その後、角度または角度の範囲を設定して、指定された画像を回転させる変換を作成する必要があります。
たとえば、上の画像を 45 度回転させてみましょう。 以下のコードを参照してください。
clc
Img = imread('cameraman.tif');
imshow(Img)
gform = randomAffine2d('Rotation',[45 45]);
Jmg = imwarp(Img,gform);
figure
imshow(Jmg)
出力:
上記のコードでは、同じ値 45 を 2 回適用しましたが、範囲を指定することもできます。関数は範囲からランダムな角度を選択して変換オブジェクトを作成します。
画像の反射、拡大縮小、せん断、移動
画像の x 軸または y 軸の反射を作成するには、XReflection
および YReflection
引数を使用できます。 デフォルトでは、これらの引数は false
に設定されているため、引数名を定義した後、true
を渡す必要があります。
反射引数は、画像を水平または垂直に反転します。 画像をせん断することもできます。これは、画像の一部を一方向に移動し、他の部分を反対方向に移動することを意味します。
XShear
および YShear
引数を使用して x 軸または y 軸のせん断を適用することもできます。その後、値を 2 要素ベクトルとして設定する必要があります。 randomaffine2d()
関数の scale
引数を使用して画像をスケーリングすることもできます。
スケール値が 1 未満の場合、イメージ サイズは小さくなります。 1 より大きい場合は増加します。 XTranslation
および YTranslation
引数を使用して x 軸または y 軸上の画像を平行移動することもできます。その後、平行移動用の 2 要素行列を定義する必要があります。
たとえば、上記のプロパティを変更して結果を見てみましょう。 以下のコードを参照してください。
clc
clear
Img = imread('cameraman.tif');
imshow(Img)
gform = randomAffine2d('XReflection',true,'Scale',[1.2 1.2],'XShear',[15 15],'XTranslation',[20 20]);
Jmg = imwarp(Img,gform);
figure
imshow(Jmg)
出力:
各プロパティを個別に変更して、元の画像での結果を確認できます。 randomaffine2d()
関数の詳細については、この リンク を確認してください。
3D 画像の場合、randomaffine3d()
関数を使用して 3D 変換オブジェクトを作成し、randomaffine2d()
関数のプロパティを変更したのと同じ方法でそのプロパティを変更できます。 randomaffine3d()
関数の詳細については、この リンク を確認してください。
出力イメージのエッジ、ビュー、境界スタイルの設定
デフォルトで nearest
に設定されている補間方法のように、imwarp()
関数のプロパティを変更することもできます。これを linear
または cubic
に変更することもできます。 出力画像のエッジが滑らかでない場合もありますが、imwarp()
関数内で SmoothEdges
引数を使用して滑らかなエッジを得ることができます。
OutputView
引数を使用して出力画像の出力ビューを変更することもできます。その後、affineOutputView()
関数を使用して作成されたビュー オブジェクトを渡す必要があります。 affineOutputView()
関数の最初の引数は入力画像のサイズで、2 番目の引数は変換オブジェクトです。
3 番目のオプション引数 BoundingStyle
は、出力画像の境界スタイルを設定するために使用されます。 CenterOutput
、FollowOutput
、SameAsInput
スタイルの 3 種類のスタイルを使用できます。
たとえば、前述の imwarp()
関数のプロパティを変更してみましょう。 以下のコードを参照してください。
clc
clear
Img = imread('cameraman.tif');
imshow(Img)
gform = randomAffine2d('Rotation',[45 45]);
Output_view = affineOutputView(size(Img),gform,'BoundsStyle','CenterOutput');
Jmg = imwarp(Img,gform,'SmoothEdges',true,'OutputView',Output_view);
figure
imshow(Jmg)
出力:
スムーズ エッジ引数を使用したため、右のイメージ (出力イメージ) は入力イメージと同じサイズになります。 スムーズ エッジ引数を使用しない場合、出力画像のサイズが大きくなります。これは、画像の回転の最初の例にも示されています。
affineOutputView()
関数の詳細については、この リンク(https://www.mathworks.com/help/images/ref/affineoutputview.html) を確認してください。 imwarp()
関数の詳細については、この リンク(https://www.mathworks.com/help/images/ref/affineoutputview.html) を確認してください。