反转图像旋转

时间:2016-10-30 22:47:38

标签: image matlab image-processing rotation mapping

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

我知道由于前向映射,图像有黑色间隙,但我并不担心,因为我试图实现没有内置函数的代码,只能将图像旋转回来,所以我可以计算错误。

1 个答案:

答案 0 :(得分:3)

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

迭代目标图像可确保没有孔(每个像素都有一个值)。

您发布的代码无法使用,请修复它...
我的答案基于您之前的帖子:Matlab image rotation

我使用'peppers.png'代替'forest.png'(我无法找到'forest.png',下次请将图片添加到您的帖子中)。

示例代码执行以下操作:

  • 旋转输入图像(您可以将其视为&#34;反向转换&#34;)。
  • 将结果图像反转(使用逆变换矩阵)。
  • 显示原始图像和结果图像的绝对差异。
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