2012-11-12 95 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)與旋轉矩陣相乘,我得到x',y',並存儲到`newImg的m1(x,y)的值(X 'Y') 「這是給下面的錯誤

??? 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

由於角將旋轉出原始圖像座標,所以旋轉圖像的一部分將得到負值(或零)newxnewy值。您不能分配一個值newImg如果newxnewy爲非正數;那些不是有效的矩陣指數。一種解決方案是檢查這種情況並跳過這樣的像素(使用continue

另一種解決方案是充分放大newImg,但這需要稍微更復雜的轉換。

這是假設你不能只使用imrotate,因爲這是作業嗎?

0

問題很簡單,答案可能不是:Matlab arrays被索引從1到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