【问题标题】:Inverse image rotation反向图像旋转
【发布时间】: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 区分大小写。 (之所以这么说是因为您在代码中使用了WH,它们在任何地方都没有初始化)
  • @AnderBiguri 我不想创建第一个图像,我要做的就是将输出图像旋转回来,以便将其与源图像进行比较并计算错误
  • @Anna1994 但是,我的第一条评论成立。你没有做反向旋转,你只是再次旋转

标签: image matlab image-processing rotation mapping


【解决方案1】:

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

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

您发布的代码不起作用,请修复它...
我的回答基于您之前的帖子: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 图片:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多