2

現在、このような同次座標を使用して行列を変換するには、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 値を保持します。

4

2 に答える 2

1

コードの問題は、整数を操作することである可能性があり、NaNはdouble値です。input_matrixをt_matrixに割り当てることはできません。nan関数を使用してt_matrixを作成する必要があります。

 t_matrix = nan(size(input_matrix));

以下はあなたのコードの直接翻訳です、私はちょうどループを削除しました

function I = translate(input_matrix, dx, dy)
    % get matrix dimensions
    [rows cols] = size(input_matrix);
    T = [1 0 dx; 0 1 dy; 0 0 1];
    % create a nan's output matrix
    I = nan(size(input_matrix));

    % create row-column index pairs
    [R C] = meshgrid(1:cols, 1:rows);
    % append 1 at the end
    IDX = [R(:) C(:) ones(numel(input_matrix),1)]';
    % transform coordinates
    V = floor(T*IDX);
    % find indices that fall into [rows, cols] range
    keep = find(V(1,:)>0 & V(1,:)<=rows & V(2,:)>0 & V(2,:)<=cols);
    % assign output only to the correct indices
    I(sub2ind([rows cols], V(1,keep), V(2,keep))) = input_matrix(sub2ind([rows cols], R(keep), C(keep)))
end

一方、次の関数を実行するだけで、質問と同じ結果を得ることができます(ただし、T行列はありません)。

function I = translate(A, dx, dy)
    I = nan(size(A));
    I(dx+1:end, dy+1:end) = A(1:end-dx, 1:end-dy);
end
于 2012-09-24T08:24:02.280 に答える
0

画像処理ツールボックスがある場合、これを実現する最も簡単な方法は、組み込み関数maketformとを使用することimtransformです。

I = imread('cameraman.tif');
dx = 40;  
dy = 100;
tform = maketform('affine',[1 0 0; 0 1 0; dx dy 1]);  %#Create a translation matrix
J = imtransform(I,tform,'XData',[0 size(I,2)+dx],'YData',[0 size(I,1)+dy]);
imshow(I), figure, imshow(J)
  • 入力として与えられた行列maketformは、あなたの行列の転置です
  • と を設定することが重要です。そうしないXDataと、が最小の出力範囲を検出するYDataため、「変換効果」が得られません。imtransform
  • 初期イメージと同じサイズを取得する場合は、次の構文を使用します。

.

 J = imtransform(I,tform,'XData',[0 size(I,2)],'YData',[0 size(I,1)]);

前の画像:

ここに画像の説明を入力

後の画像:

ここに画像の説明を入力

後の画像(同じサイズを維持):

ここに画像の説明を入力

于 2012-09-23T20:48:20.770 に答える