MATLAB でのイメージへの幾何学的変換の適用

Ammar Ali 2024年2月15日
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 を使用した変換

上記の出力では、右側の画像が変更されていることがわかります。唯一の変更はピクセルの位置です。 与えられた画像と関数から取得したい出力のタイプに応じて、変換行列を変更することもできます。

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)

出力:

imwarp を使用した画像の回転

上記のコードでは、同じ値 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 は、出力画像の境界スタイルを設定するために使用されます。 CenterOutputFollowOutputSameAsInput スタイルの 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)

出力:

imwarpのプロパティ変更

スムーズ エッジ引数を使用したため、右のイメージ (出力イメージ) は入力イメージと同じサイズになります。 スムーズ エッジ引数を使用しない場合、出力画像のサイズが大きくなります。これは、画像の回転の最初の例にも示されています。

affineOutputView() 関数の詳細については、この リンク(https://www.mathworks.com/help/images/ref/affineoutputview.html) を確認してください。 imwarp() 関数の詳細については、この リンク(https://www.mathworks.com/help/images/ref/affineoutputview.html) を確認してください。

著者: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

関連記事 - MATLAB Image