2016-10-30 15 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

私は画像が前方マッピングのために黒のギャップを持っていますが、私はそれについて心配していないよ知って構築されずに、私はコードを実装しようとしているとして、私はエラーを計算することができるので、画像を回転させるだけの関数である。

+1

コードが逆回転をしていません。同じ変換を2番目のループと同じように最初のループに適用しているので、同じことをしています! –

+0

しかし、あなたの質問に答えるには:フォワードマッピングで変換すると、情報が失われます!最初のイメージでピクセルにアクセスしたことがない場合は、2番目のイメージにピクセルが存在しないため、この2番目のイメージを使用して最初のイメージを再作成することはできません。 –

+0

わからない場合。 MATLABは大文字と小文字を区別します。 (あなたがコードで 'W'と' H'を使っているのでこれを言っているのですが) –

答えて

2

ソースイメージ、逆変換マトリックス、および反復デスティネーションイメージを反復する代わりに。

反復する宛先イメージでは、穴がないことが保証されます(各ピクセルに値が設定されます)。

あなたが投稿したコードが動作していない、それを修正してください...
私はあなたの前のポストに私の答えをもと:Matlab image rotation

私は(私は次の、'forest.png'を見つけることができません'peppers.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