アフィン変換を使って​画像を平行移動し、余​白を追加するにはどう​すればよいですか?

17 ビュー (過去 30 日間)
MathWorks Support Team
MathWorks Support Team 2025 年 10 月 16 日 0:00
編集済み: MathWorks Support Team 2025 年 10 月 27 日 2:02
アフィン変換の手順についてご相談させてください。まず、参照用のアフィン変換として、サンプル画像には実際に変化を与えない処理を行っています。
I = imread("pout.tif");
A1 = [1 0 0; 0 1 0; 0 0 1];
tform1 = affinetform2d(A1);
Rout1 = affineOutputView(size(I), tform1, "BoundsStyle", "FollowOutput");
J1 = imwarp(I, tform1, "OutputView", Rout1);
imshow(J1)
次に、以下の2点を実現したいと考えています。
  1. 画像をY方向(縦方向)に100ピクセル分シフトさせること
  2. 上記の平行移動によって画像下部に余白を追加すること
しかし、下記の手順を試しても、上記の目的は達成できませんでした。
A2 = [1 0 0; 0 1 100; 0 0 1];
tform2 = affinetform2d(A2);
Rout2 = affineOutputView(size(I), tform2, "BoundsStyle", "FollowOutput");
J2 = imwarp(I, tform2, "OutputView", Rout2);
imshow(J2)
 
この場合、なぜアフィン変換を適用しても見た目に変化が現れないのでしょうか?

採用された回答

MathWorks Support Team
MathWorks Support Team 2025 年 10 月 27 日 0:00
編集済み: MathWorks Support Team 2025 年 10 月 27 日 2:02
以下のような変換パターンが考えられます。
ケース1:平行移動のみの場合
画像を平行移動した場合、Rout2(出力参照枠)のワールド座標範囲が変化します。具体的には、ワールド座標の開始位置が100から100.5へとシフトします。このように、出力ビューも平行移動に追従するため、ビューの“原点”も(100.5, 0)に移動します。
A = [1 0 0; 0 1 100; 0 0 1];
tform = affinetform2d(A);
Rout = affineOutputView(size(I), tform, "BoundsStyle", "FollowOutput");
J = imwarp(I, tform, "OutputView", Rout);
imshow(J, Rout)
ケース2:黒い余白を表示する場合
この場合は、出力参照枠(Rout)のサイズ自体を大きくします。ただし、画像全体のサイズも合わせて大きくなる点に注意が必要です。
A = [1 0 0; 0 1 100; 0 0 1];
tform = affinetform2d(A);
xShift = 0;
yShift = 100;
sz = size(I) + [yShift xShift];
Rout = affineOutputView(sz, tform, "BoundsStyle", "FollowOutput");
J = imwarp(I, tform, "OutputView", Rout);
imshow(J, Rout)
ケース3:BoundsStyleにcenterOutput(デフォルト値)を使う場合
この設定では、画像が縦方向にシフトして表示されるのを確認できます。ただし、表示範囲や画像サイズ自体も変化します。
A = [1 0 0; 0 1 100; 0 0 1];
tform = affinetform2d(A);
xShift = 0;
yShift = 100;
sz = size(I) + [yShift xShift];
Rout = affineOutputView(sz, tform, BoundsStyle="centerOutput");
J = imwarp(I, tform, "OutputView", Rout);
imshow(J, Rout)
ケース4:出力範囲と画像サイズを変えずに画像の移動だけを見せたい場合
出力範囲や画像サイズを一定に保ったまま画像の移動を表現したい場合は、BoundsStyleにcenterOutput(デフォルト値)を指定します。
A = [1 0 0; 0 1 100; 0 0 1];
tform = affinetform2d(A);
Rout = affineOutputView(size(I), tform, BoundsStyle="centerOutput");
J = imwarp(I, tform, "OutputView", Rout);
imshow(J, Rout)

その他の回答 (0 件)

カテゴリ

Help Center および File Exchangeイメージ解析 についてさらに検索

タグ

タグが未入力です。

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!