의 일부이므로 imrotate
함수를 사용하지 않고 Matlab :
loose
매개 변수를 사용하면 출력 크기가 입력 이미지의 크기와 다르고 에 비해 기능이 너무 느리지 않음을 의미합니다. imrotate
. 이미 함수 를 찾았습니다 ( imshow
및 bestblk
을 사용자 고유의 함수로 바꾸십시오. 도구 상자 사용), 그러나 큰 이미지의 경우 정말 느립니다 . 내 접근 방식은 루프를 만들고 가능한 한 interp2
에 의존하는 것을 피하려고합니다.
함수의 서명은 다음과 같습니다.
imOutput = my_imrotate (imInput, theta_degres, interpolation, bbox)
여기서 :
interpolation
은 bilinear
이고, bicubic
또는 가장 가까운
, bbox
는 crop
또는 loose
입니다. Crop
I 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);
Loose
내 생각은 원본 이미지를 포함 할 프레임의 크기를 다음과 같이 계산하는 것입니다. 회전 된 이미지는 다음과 같습니다.
interp2
을 사용합니다. loose
매개 변수를 사용하여 회전 된 이미지의 크기를 얻으려면 rotation_matrix
를 계산합니다. [1111 0582] rotate_points 입력 이미지의 모서리 좌표 p
:
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);