我正在尝试使用我自己的旋转图像算法而不使用imrotate。
clear all
img1 = imread('image1.jpg');imshow(img1);
[m,n,p]=size(img1);
thet = pi/6;
m1=round(m*1.5);
n1=round(n*1.5);
rotatedImg = zeros(m1,n1);
for i=1:m
for j=1:n
t = uint16((i)*cos(thet)-(j)*sin(thet)+m+100);
s = uint16((i)*sin(thet)+(j)*cos(thet));
if i>0 && j>0 && i<=m && j<=n
try rotatedImg(t,s,1)=img1(i,j,1);
catch
a=1;
end
end
end
end
figure;
imshow(rotatedImg);
然而由于某些原因,在某个角度,图像的某些部分被剪裁,因此整个图像不在窗口上。我似乎无法弄清楚如何正确地做到这一点。看起来我需要每次以不同的角度使窗口变大,这样图像就不会被剪裁。
此外,我的图像充满了黑点,我认为我需要进行某种插值。我该怎么做?
* 我正在使用的图像是(http://i.stack.imgur.com/kDdx5.jpg)并以这些角度旋转 - pi / 6,pi / 2,((pi / 6)* 4)* < / p>
答案 0 :(得分:2)
嗯,有两个问题:
始终围绕原点旋转。这就是你需要为每个角度调整偏移(100)的原因。更好的解决方案是围绕图像中心旋转。
您没有进行任何插值。虽然这不是原因本身,但由于舍入错误,您可能无法点击目标图像中的每个像素。最好迭代目标图像并从源中获取正确的像素。
这是我的解决方案:
clear all
img1 = imread('ngc6543a.jpg');
imshow(img1);
[m,n,p]=size(img1);
thet = pi/6;
m1=round(m*1.5);
n1=round(n*1.5);
rotatedImg = zeros(m1,n1, 3, 'uint8');
tic
for i=1:m1
for j=1:n1
p = [i; j] - [m1/2; n1/2];
source = [cos(thet), sin(thet); -sin(thet), cos(thet)] * p;
source = source + [m/2; n/2];
t = int16(source(1));
s = int16(source(2));
if t>0 && s>0 && t<=m && s<=n
rotatedImg(i,j,:) = img1(t,s,:);
end
end
end
toc
figure;
imshow(rotatedImg);
虽然看起来没问题,但我肯定会推荐双线性插值。
我知道,所以你的图像不是二次方的。在这种情况下,仅将新维度称为旧的* 1.5,但更准确(或更慷慨)是不够的。
这是适用于所有角度和任意图像的最终解决方案。 Matlab有点繁琐,因为索引是(y,x),否则代码应该没问题。
clear all
img1 = imread('kDdx5.jpg');
imshow(img1);
[orgHeight,orgWidth,p]=size(img1);
thet = pi/7;
matrix = [cos(thet), -sin(thet); sin(thet), cos(thet)];
p1 = abs(matrix * [orgWidth/2; orgHeight/2]);
p2 = abs(matrix * [orgWidth/2; -orgHeight/2]);
corner = [max(p1(1), p2(1)); max(p1(2), p2(2))];
newWidth = ceil(2*corner(1));
newHeight = ceil(2*corner(2));
rotatedImg = zeros(newHeight, newWidth, 3, 'uint8');
tic
for i=1:newWidth
for j=1:newHeight
p = [i; j] - [newWidth/2; newHeight/2];
source = matrix * p;
source = source + [orgWidth/2; orgHeight/2;];
t = int16(source(1));
s = int16(source(2));
if t>0 && s>0 && s<=orgHeight && t<=orgWidth
rotatedImg(j,i,:) = img1(s,t,:);
end
end
end
toc
figure;
imshow(rotatedImg);