Imag없이 이미지 회전 e Processing Toolbox

의 일부이므로 imrotate 함수를 사용하지 않고 Matlab :

  • 을 사용하여 정사각형이 아닌 이미지를 회전하고 싶습니다. Image Processing Toolbox,
  • 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

내 생각은 원본 이미지를 포함 할 프레임의 크기를 다음과 같이 계산하는 것입니다. 회전 된 이미지는 다음과 같습니다.

  1. 원본 이미지를 패딩하여 크기가 프레임 크기 인 이미지가되도록합니다.
  2. 패딩 된 이미지에 interp2 을 사용합니다.
  3. 패딩이 남아 있지 않고 회전 된 이미지를 갖도록 결과 이미지를 자릅니다.

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);

8
задан Qix 10 September 2014 в 21:05
поделиться