【发布时间】:2016-10-30 22:47:37
【问题描述】:
我编写了以下代码,没有任何 Matlab 内置函数来旋转图像。我试图编写另一个循环来反转旋转。图像确实旋转回来,但我仍然得到先前旋转图像的大小。怎样才能去掉图片中的黑色部分?
INPUT_IMAGE = 'forest.png';
img_in=double(imread(INPUT_IMAGE))./255;
h=size(img_in,1);
w=size(img_in,2);
R=[cos(th) -sin(th) 0 ; sin(th) cos(th) 0 ; 0 0 1];
T=[1 0 (-w/2) ; 0 1 (-h/2) ; 0 0 1];
F=inv(T)*R*T;
img_out=zeros(h,w,3);
%Rotate image
for i=1:w
for j=1:h
a = [i ; j ; 1];
b = inv(F) * a;
x = b(1)/b(3);
y = b(2)/b(3);
x = floor(x);
y = floor(y);
if (x>0 & x<=W & j>0 & j<=H)
img_out(y,x,:)=img_in(j,i,:);
end
end
end
img_out2=zeros(h,w,3);
%invert rotation
for i=1:w
for j=1:h
a = [i ; j ; 1];
b = F * a;
x = b(1)/b(3);
y = b(2)/b(3);
x = floor(x);
y = floor(y);
if (x>0 & x<=W & j>0 & j<=H)
img_out2(y,x,:)=img_out(j,i,:);
end
end
end
结果:
我知道图像由于前向映射而有黑色间隙,但我并不担心,因为我正在尝试实现一个没有内置函数的代码,这些函数只会将图像旋转回来,以便我可以计算错误.
【问题讨论】:
-
您发布的代码没有进行反向旋转。您在第一个循环中应用与第二个循环相同的变换,因此它们在做同样的事情!
-
但是,要回答您的问题:如果您使用前向映射进行转换,那么信息就会丢失!如果一个像素从未在第一张图像中被访问过,那么它就不会存在于第二张图像中,因此您不能使用第二张图像再次创建第一个!
-
如果你不知道的话。 MATLAB 区分大小写。 (之所以这么说是因为您在代码中使用了
W和H,它们在任何地方都没有初始化) -
@AnderBiguri 我不想创建第一个图像,我要做的就是将输出图像旋转回来,以便将其与源图像进行比较并计算错误
-
@Anna1994 但是,我的第一条评论成立。你没有做反向旋转,你只是再次旋转
标签: image matlab image-processing rotation mapping