以下のような変換パターンが考えられます。
ケース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)