我想旋轉用Matlab非平方圖像:沒有圖像處理工具箱旋轉圖像
- 而不使用
imrotate
功能,因爲它是圖像處理工具箱的一部分, - 與
loose
參數,這意味着輸出的大小不同於輸入圖像的大小, - 並且與
imrotate
相比具有不太慢的功能。
我已經爲了做到這一點(只需更換imshow
和bestblk
用自己的功能,以便不使用工具箱)發現a function,但它是大型圖片很慢。我的方法是儘量避免製作循環,並儘可能依靠interp2
。
函數的簽名將是:
imOutput = my_imrotate(imInput, theta_degres, interpolation, bbox)
其中:
interpolation
將是bilinear
,bicubic
或nearest
,bbox
將crop
或loose
。
作物
我已經有了一個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);
寬鬆
我的想法是計算的大小該幀將包含原始圖像以及旋轉的圖像,然後:
- 墊原始圖像,以便具有一個圖像,其大小是該幀的大小,
- 填充的圖像上使用
interp2
, - 作物所產生的圖像,以具有不遺體旋轉圖像的填充。
爲了獲得與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);
令人驚訝的是這個問題有3K的意見,但只有4 upvotes,答案只有2 upvotes,但問題是明確的,正確回答。 – Wok 2013-01-14 17:44:53