在matlab中手动旋转图像

时间:2012-11-12 12:49:32

标签: matlab rotation computer-vision image-rotation

我正在尝试使用以下代码手动旋转图像。

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',并将m1(x,y)的值存储到` newImg(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);

我不知道我做错了什么。

3 个答案:

答案 0 :(得分:1)

旋转图像的一部分将获得负(或零)newxnewy值,因为角将旋转出原始图像坐标。如果newImgnewx为非正数,则无法为newy分配值;那些不是有效的矩阵指数。一种解决方案是检查这种情况并跳过这些像素(使用continue

另一个解决方案是充分扩大newImg,但这需要稍微复杂的转换。

这假设你不能只使用imrotate,因为这是作业?

答案 1 :(得分:0)

问题很简单,答案可能不是:Matlab arrays从一个索引到N(而在许多编程语言中,它从0到(N-1))。

尝试newImg( max( min(1,newX), m1.size() ) , max( min(1,newY), m1.size() ) )也许(我在工作时没有Matlab,所以我可以判断它是否会起作用),但结果图像会被破坏。

答案 2 :(得分: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