2016-10-30 93 views
-1

我写了下面的代码,没有任何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 

结果:

result

我知道图像已经由于在转发映射黑色的差距,但我并不担心,由于我试图执行一个代码,而无需建-in函数只会将图像旋转回来,以便计算错误。

+1

您发布的代码是不是做反向旋转。你在第一个循环中应用了与第二个循环相同的变换,因此他们正在做同样的事情! –

+0

但是,要回答您的问题:如果使用正向映射进行转换,则信息会丢失!如果一个像素在第一个图像中从未被访问,那么它将不会存在于第二个图像中,所以您不能再使用这个第二个图像来创建第一个图像! –

+0

如果你不知道的话。 MATLAB是区分大小写的。 (说这是因为你在你的代码中使用了'W'和'H',它们已经被初始化了) –

回答

2

而不是迭代源图像,逆变换矩阵和迭代目标图像。

迭代目标图像保证没有空洞(每个像素都有一个值)。

你已经张贴不工作的代码,请修复它...
我根据我的回答对你以前的帖子:Matlab image rotation

我用'peppers.png',而不是'forest.png'(我无法找到'forest.png',下一时间,请将图像添加到您的帖子)。

该示例代码执行以下步骤:

  • 旋转输入图像(可以把它当作“逆变换”)。
  • 旋转结果图像(使用逆变换矩阵)。
  • 显示原始图像和结果图像的绝对差值。

close all; 
clear all; 

img_in = 'peppers.png'; 

img_in =double(imread(img_in))./255; 
orig_in = img_in; 

h=size(img_in,1); 
w=size(img_in,2); 

th = pi/4; 
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 

     x = [i ; j ; 1]; 
     y = F * x; 

     a = y(1)/y(3); 
     b = y(2)/y(3); 

     a = round(a); 
     b = round(b); 

     if (a>0 && a<=w && b>0 && b<=h) 
      img_out(j,i,:)=img_in(b,a,:); 
     end 
    end 
end 

figure;imshow(img_out); 

%Rotate back 
%--------------------------------------------------------- 

img_in = img_out; 
img_out = zeros(h,w,3); 

%Inverse transformation matrix. 
F = inv(F); 

%Rotate image (back) 
for i=1:w 
    for j=1:h 

     x = [i ; j ; 1]; 
     y = F * x; 

     a = y(1)/y(3); 
     b = y(2)/y(3); 

     a = round(a); 
     b = round(b); 

     if (a>0 && a<=w && b>0 && b<=h) 
      img_out(j,i,:)=img_in(b,a,:); 
     end 
    end 
end 

figure;imshow(img_out); 

img_diff = abs(orig_in - img_out); 
figure;imshow(img_diff); 

img_diff图像:
enter image description here