【问题标题】:Implement matrix transformations with homogeneous coordinates使用齐次坐标实现矩阵变换
【发布时间】: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


    【解决方案1】:

    您的代码的问题可能是您对整数进行操作,而 NaN 是一个双精度值。您不能将 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
    

    【讨论】:

      【解决方案2】:

      如果你有图像处理工具箱,最简单的方法是使用内置函数maketformimtransform

      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 的输入矩阵是您的矩阵的转置
      • 设置XDataYData很重要,否则不会得到“翻译效果”,因为imtransform会找到最小的输出范围。
      • 如果要获得与初始图像相同的大小,请使用以下语法:

      .

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

      之前的图片:

      图片之后:

      图片之后(保持相同大小):

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-08
        • 2012-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-29
        • 2016-11-04
        • 1970-01-01
        相关资源
        最近更新 更多