код поворота изображения в Matlab

Я новичок в компьютерном зрении. Я пытаюсь сделать преобразование вращения с помощью Matlab. Мой код

I = imread('Koala.jpg');

rows = size(I, 1);
cols = size(I, 2);

deg = 45;
deg = deg * pi / 180;

C = uint8(zeros(size(I)));

mid = ceil([rows+1 cols+1] / 2);

[x1, x2] = meshgrid(1:rows, 1:cols);
M = [cos(deg) sin(deg); -sin(deg) cos(deg)];

X = bsxfun(@minus, [x1(:) x2(:)], mid) * M;
X = round(bsxfun(@plus, X, mid));

x1 = X(:, 1);
x2 = X(:, 2);
x1(x1<1) = 1;
x2(x2<1) = 1;
x1(x1>rows) = rows;
x2(x2>cols) = cols;
X = [x1(:) x2(:)];

m = 1;
for i=1:rows
    for j=1:cols
        C(X(m, 1), X(m, 2), :) = I(i, j, :);
        m = m + 1;
    end
end

Это работает, но в результате много пикселей без значений. Я думаю, когда я делаю «X2 = X * M», диапазон изображения при преобразовании не совпадает с исходным, и многие значения теряются.


person Pavel Angel Mendoza Villafane    schedule 16.10.2016    source источник
comment
Будет ли imrotate мошенничеством?   -  person Andras Deak    schedule 17.10.2016


Ответы (1)


Если у вас есть Image Processing Toolbox, я бы просто использовал imrotate для выполнения ротация для вас.

out = imrotate(I, 45);

В противном случае я бы попытался векторизовать ваш подход и использовать interp2. Вы можете повернуть все центры пикселей на указанный угол, а затем произвести выборку в этих повернутых точках.

% Compute the coordinates of all pixel centers
[x, y] = meshgrid(1:size(I, 2), 1:size(I, 1));

% Compute the rotation matrix
R = [ cos(deg) sin(deg); 
     -sin(deg) cos(deg)];

xy = [x(:), y(:)];

% Compute the middle point
mid = mean(xy, 1);

% Subtract off the middle point
xy = bsxfun(@minus, xy, mid);

% Rotate all of these coordinates by the desired angle
xyrot = xy * R;

% Reshape the coordinate matrices
xy = reshape(xy, [size(x), 2]);
xyrot = reshape(xyrot, [size(x), 2]);

% Interpolate the image data at the rotated coordinates
out = interp2(xy(:,:,1), xy(:,:,2), I, xyrot(:,:,1), xyrot(:,:,2));
person Suever    schedule 16.10.2016