2011-06-15 66 views
8

我想旋轉用Matlab非平方圖像:沒有圖像處理工具箱旋轉圖像

  • 而不使用imrotate功能,因爲它是圖像處理工具箱的一部分,
  • loose參數,這意味着輸出的大小不同於輸入圖像的大小,
  • 並且與imrotate相比具有不太慢的功能。

我已經爲了做到這一點(只需更換imshowbestblk用自己的功能,以便不使用工具箱)發現a function,但它是大型圖片很慢。我的方法是儘量避免製作循環,並儘可能依靠interp2


函數的簽名將是:

imOutput = my_imrotate(imInput, theta_degres, interpolation, bbox)

其中:

  • interpolation將是bilinearbicubicnearest
  • bboxcroploose

作物

我已經有了一個crop參數一個很好的結果,但我不能設法找到了loose參數的偏移量。

下面是crop參數,其中Z是輸入和Zi代碼的輸出:

Z = double(imInput); 
sz = size(Z); 
[X,Y] = meshgrid(1:sz(2), 1:sz(1)); 
%# Center 
c = sz(end:-1:1)/2; 
%# Angle 
t = theta_degres*pi/180; 
%# Rotation 
ct = cos(t); 
st = sin(t); 
Xi = c(1) + ct*(X-c(1))-st*(Y-c(2)); 
Yi = c(2) + st*(X-c(1))+ct*(Y-c(2)); 
%# Rotation 
Zi = interp2(X, Y, Z, Xi, Yi); 

寬鬆

我的想法是計算的大小該幀將包含原始圖像以及旋轉的圖像,然後:

  1. 墊原始圖像,以便具有一個圖像,其大小是該幀的大小,
  2. 填充的圖像上使用interp2
  3. 作物所產生的圖像,以具有不遺體旋轉圖像的填充。

爲了獲得與loose參數旋轉圖像的大小,我計算rotation_matrix和四角的輸入圖像的p的座標呼叫rotate_points

rotation_matrix = [ct, -st; st, ct]; 
rotate_points = @(p) bsxfun(@plus, c', rotation_matrix * bsxfun(@minus, p, c)')'; 

任何幫助將是非常讚賞。


編輯:使用下面的答案提供的解決方案,而下面的代碼,它似乎工作完全正確:

%# See the answer below 
[sz1,sz2] = size(Z); 
sz1New = sz1*cos(t)+sz2*sin(t); 
sz2New = sz2*cos(t)+sz1*sin(t); 
[Xi,Yi] = meshgrid(-(sz2New-1)/2:(sz2New-1)/2,-(sz1New-1)/2:(sz1New-1)/2); 
%# now all that's left is rotating Xi,Yi - I have already subtracted the center 

%# My little piece of additional code 
Xii = (1+sz2)/2 + ct*Xi - st*Yi; 
Yii = (1+sz1)/2 + st*Xi + ct*Yi; 
Zi = interp2(X, Y, Z, Xii, Yii); 
+0

令人驚訝的是這個問題有3K的意見,但只有4 upvotes,答案只有2 upvotes,但問題是明確的,正確回答。 – Wok 2013-01-14 17:44:53

回答

4

對於loose版本,所有你需要做的是找出你需要多少填充。你可以用幾何幾何很容易估計它:

如果你繪製'鬆散'的矩形,你基本上將四個直角三角形添加到原始矩形。三角形的斜邊是矩形的兩側。如果您可以確定其他兩面,則可以輕鬆計算新邊的長度,從而可以計算填充。幸運的是,直角三角形的其中一個角度正是您的旋轉角度。事實證明,你甚至不需要明確計算填充 - 你只需創建一個更大的陣列Xi,Yi,它具有'鬆散'圖像的大小。

這樣:

[sz1,sz2] = size(Z); 
sz1New = sz1*cos(t)+sz2*sin(t); 
sz2New = sz2*cos(t)+sz1*sin(t); 
[Xi,Yi] = meshgrid(-(sz2New-1)/2:(sz2New-1)/2,-(sz1New-1)/2:(sz1New-1)/2); 
%# now all that's left is rotating Xi,Yi - I have already subtracted the center 
+0

太棒了!我相信我(幾乎)明白了,謝謝你! – Wok 2011-06-15 12:25:20

+0

@wok:我剛纔看到你總是分開加減中心。如果所有的meshgrid都是從'-s/2:s/2'開始的,或者在我的解決方案中只用1:szNew,可能會更容易。 – Jonas 2011-06-15 12:40:34

+0

太棒了!我可以重寫'imrotate',但它比900x1000圖像上的'imrotate'慢。但仍然可以接受! :) – Wok 2011-06-15 14:37:26