2012-09-23 32 views
2

目前,我需要用matlab transformate使用這樣實現矩陣變換與齊次座標

% 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一樣大小。

不過,我目前的方案不細使用圖像的工作(這不穿空的空間「男」的價值觀,它把「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值空的空間。

回答

1

您的代碼問題可能是您對整數進行操作,而NaN是雙精度值。您無法將input_matrix分配給t_matrix。你應該使用楠函數創建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 
0

最簡單的方式實現它,如果您有圖像處理工具箱,是使用內置函數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)]); 

圖像之前:

enter image description here

圖片後:

enter image description here

圖像之後(保持相同的大小):

enter image description here