Как повернуть изображение вокруг центра объекта в Matlab?

Функция imrotate в Matlab вращает изображение вокруг центра. Как повернуть изображение по пользовательским координатам?

Например, центр блоба в бинарной маске. Если вы используете imcrop и размещаете каплю в центре, как изменить ее форму, чтобы она соответствовала исходному изображению?

Код

% create binary mask 
clc; 
clear;
mask= zeros(400,600,'logical'); 
positein = [280,480];
L = 40;
x = positein (1);
y = positein (2);
mask(x,y-L:y+L) = 1;
for i =1:8
mask(x+i,y-L:y+L) = 1;
mask(x-i,y-L:y+L) = 1;
end
Angle = 45;
mask_after_rotation = imrotate(mask,-Angle,'crop');
figure,
subplot(1,2,1),imshow(mask),title('before rotation');
subplot(1,2,2),imshow(mask_after_rotation),title('after rotate 45');

person mbghr    schedule 26.05.2018    source источник


Ответы (2)


Обычно это выполняется путем построения аффинного преобразования, которое переводит точку, вокруг которой мы хотим повернуться, в начало координат, затем выполняет поворот, а затем переводит обратно.

Например, чтобы повернуть на -45 градусов, как в вашем примере, мы могли бы сделать следующее

% create binary mask
mask = zeros(400, 600,'logical'); 
positein = [480, 200];
W = 40; H = 8;
x = positein(1); y = positein(2);
mask(y-H:y+H, x-W:x+W) = 1;

angle = -45;

% translate by -positein, rotate by angle, then translate back by pt
T = [1 0 0; 0 1 0; -positein 1];
R = [cosd(angle) -sind(angle) 0; sind(angle) cosd(angle) 0; 0 0 1];
Tinv = [1 0 0; 0 1 0; positein 1];
tform = affine2d(T*R*Tinv);
mask_rotated = imwarp(mask, tform, 'OutputView', imref2d(size(mask)));

figure(1); clf(1);
subplot(1,2,1),imshow(mask),title('before rotation');
subplot(1,2,2),imshow(mask_rotated),title('after rotate 45');

В качестве альтернативы вы можете установить эталонный объект так, чтобы желаемая координата находилась в начале координат.

% Set origin to positein, then rotate
xlimits = 0.5 + [0, size(mask,2)] - positein(1);
ylimits = 0.5 + [0, size(mask,1)] - positein(2);
ref = imref2d(size(mask), xlimits, ylimits);
R = [cosd(angle) -sind(angle) 0; sind(angle) cosd(angle) 0; 0 0 1];
tform = affine2d(R);
mask_rotated = imwarp(mask, ref, tform, 'OutputView', ref);
person jodag    schedule 26.05.2018

Вы можете выполнить серию преобразований, чтобы добиться вращения вокруг произвольной точки, а именно: 1) переместить произвольную точку в центр изображения, 2) повернуть изображение на заданный угол и 3) перевести его обратно в исходное положение. Например, если вы хотите повернуть маску вокруг центра капли в вашем случае, вы можете выполнить следующие шаги.

trns_mask = imtranslate(mask, [-180, -80]);             % Move to the origin
trns_mask_rotated = imrotate(trns_mask,-Angle,'crop');  % Rotate
mask_after_rotation = imtranslate(trns_mask_rotated, [180, 80]);    % Move back

Есть options для функции imtranslate(), с которой вы можете поиграться, чтобы убедиться, что вы не теряете информацию об изображении во время преобразования.

person Nakini    schedule 26.05.2018
comment
@mbghr, входными аргументами для imtranslate являются x и y вместо строки и столбца. Итак, при движении вам нужно -180 (= 600/2 - 480) по оси X и -80 (= 400/2 - 280) по оси Y. - person Nakini; 26.05.2018