我正在尝试使用以下代码手动旋转图像。
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);
我不知道我做错了什么。
答案 0 :(得分:1)
旋转图像的一部分将获得负(或零)newx
和newy
值,因为角将旋转出原始图像坐标。如果newImg
或newx
为非正数,则无法为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