1

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

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)in 的值存储到 `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);

我不知道我做错了什么。

4

3 回答 3

1

部分旋转图像将变为负数(或零)newxnewy值,因为角点将旋转出原始图像坐标。newImg您不能为if newxor是非正数赋值newy;这些不是有效的矩阵索引。一种解决方案是检查这种情况并跳过此类像素(使用continue

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

这是假设您不能imrotate因为这是家庭作业而仅仅使用?

于 2012-11-12T12:52:16.090 回答
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
于 2014-04-17T17:45:13.827 回答
0

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

尝试一下newImg( max( min(1,newX), m1.size() ) , max( min(1,newY), m1.size() ) )(我没有使用 Matlab,所以我可以判断它是否可以工作),但生成的图像将被裁剪。

于 2012-11-12T12:55:46.520 回答