現在、このような同次座標を使用して行列を変換するには、matlab を使用してプログラムを作成する必要があります。
% for translation
T = [1 0 dx; 0 1 dy; 0 0 1];
例えば:
A =
92 99 1 8 15 67 74 51 58 40
98 80 7 14 16 73 55 57 64 41
4 81 88 20 22 54 56 63 70 47
85 87 19 21 3 60 62 69 71 28
86 93 25 2 9 61 68 75 52 34
17 24 76 83 90 42 49 26 33 65
23 5 82 89 91 48 30 32 39 66
79 6 13 95 97 29 31 38 45 72
10 12 94 96 78 35 37 44 46 53
11 18 100 77 84 36 43 50 27 59
>> I = translate(A, 4, 4)
I =
NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN 92 99 1 8 15 67
NaN NaN NaN NaN 98 80 7 14 16 73
NaN NaN NaN NaN 4 81 88 20 22 54
NaN NaN NaN NaN 85 87 19 21 3 60
NaN NaN NaN NaN 86 93 25 2 9 61
NaN NaN NaN NaN 17 24 76 83 90 42
セルNaN
は「空白」を意味します。ご覧のとおり、A
行列はx
軸上で 4 単位、y
軸上で 4 単位変換され、値が残りNaN
ます。出力行列I
は のように同じサイズでなければなりませんA
。
ただし、私の現在のプログラムは、画像を使用して正常に動作しません (空のスペースに「NaN」値を配置せず、「1」を配置します):
だから、これは私のプログラムです:
function t_matrix = translate(input_matrix, dx, dy)
[rows cols] = size(input_matrix);
t_matrix = input_matrix;
t_matrix(:) = NaN;
T = [1 0 dx; 0 1 dy; 0 0 1];
for n = 1:numel(input_matrix)
[x y] = ind2sub([rows cols], n);
v = [x y 1]';
v = T*v;
a = floor(v(1));
b = floor(v(2));
if a > 0 && b > 0
t_matrix(a, b) = input_matrix(x,y);
end
end
t_matrix = t_matrix(1:rows, 1:cols);
matlab を使用して同次変換をより簡単に実装するにはどうすればよいですか?
唯一の制限: このマトリックスを使い続ける:
% for translation
T = [1 0 dx; 0 1 dy; 0 0 1];
空のスペースには NaN 値を保持します。