【发布时间】:2012-09-23 20:42:50
【问题描述】:
目前,我需要使用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 值。
【问题讨论】:
标签: matlab image-processing matrix transformation