2012-11-12 2 views
1

Я пытаюсь повернуть изображение вручную, используя следующий код.Вращение изображения вручную в matlab

clc; 
m1 = imread('owl','pgm'); % a simple gray scale image of order 260 X 200 
newImg = zeros(500,500); 
newImg = int16(newImg); 
rotationMatrix45 = [cos((pi/4)) -sin((pi/4)); sin((pi/4)) cos((pi/4))]; 

for x = 1:size(m1,1) 
    for y = 1:size(m1,2) 
     point =[x;y] ; 
     product = rotationMatrix45 * point; 
     product = int16(product); 
     newx =product(1,1); 
     newy=product(2,1); 
     newImg(newx,newy) = m1(x,y); 
    end 
end 
imshow(newImg); 

Просто я итерация через каждый пиксель изображения m1, умножая m1 (х, у) с матрицей вращения, я получаю x',y' и хранения значения m1(x,y) и `newImg (х« у») "НО он дает следующую ошибку

??? Attempted to access newImg(0,1); index must be a positive integer or logical. 

Error in ==> at 18 
     newImg(newx,newy) = m1(x,y); 

Я не знаю, что я делаю неправильно.

ответ

1

Часть повернутого изображения будет иметь отрицательный (или нулевой) newx и newy значения, поскольку углы будут вращаться из исходных координат изображения. Вы не можете присвоить значение newImg, если newx или newy неположительно; это недействительные матричные индексы. Одним из решений было бы проверить эту ситуацию и пропустить такие пиксели (с continue)

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

Это предполагается, что вы не можете просто использовать imrotate, потому что это домашнее задание?

0

Проблема проста, ответ может быть не так: Matlab arrays индексируются от одного до N (тогда как во многих языках программирования это от 0 до (N-1)).

Возможно, у newImg(max(min(1,newX), m1.size()) , max(min(1,newY), m1.size())) (у меня нет работы Matlab, поэтому я могу сказать, будет ли это работать), но получившееся изображение будет обрезано.

+1

Это положит все пиксели, выходящие за рамки изображения на краю нового изображения. Я думаю, что это будет выглядеть довольно забавно, и я не могу себе представить, что это желаемый результат. – Junuxx

+0

О, ты прав. В этом случае я думаю, что он должен пойти с обнаружением egdes: http://homepages.inf.ed.ac.uk/rbf/HIPR2/rotate.htm – lucasg

0

это старый пост, поэтому я думаю, что он не поможет OP, но поскольку мне помогла его попытка, я разместил здесь свой исправленный код. в значительной степени свобода в реализации относительно того, как вы имеете дело с неназначенными пикселями, а также, чтобы вы сохранили первоначальный размер рисунка, что заставит вас обрезать области, падающие «вне» его. следующая функция поворачивает изображение вокруг его центра, оставляет неназначенные пиксели как «сожженные» и обрезает края.

function [h] = rot(A,ang) 
rotMat = [cos((pi.*ang/180)) sin((pi.*ang/180)); -sin((pi.*ang/180)) cos((pi.*ang/180))]; 
centerW = round(size(A,1)/2); 
centerH = round(size(A,2)/2); 
h=255.* uint8(ones(size(A))); 
for x = 1:size(A,1) 
    for y = 1:size(A,2) 
     point =[x-centerW;y-centerH] ; 
     product = rotMat * point; 
     product = int16(product); 
     newx =product(1,1); 
     newy=product(2,1); 
      if newx+centerW<=size(A,1)&& newx+centerW > 0 && newy+centerH<=size(A,2)&& newy+centerH > 0 
      h(newx+centerW,newy+centerH) = A(x,y); 
      end 
    end 
end 
Смежные вопросы