2009-11-28 10 views
10

マイ平原コードを使用した最近傍補間により画像を回転するには:どのように補間することなく、Matlabの

im1 = imread('lena.jpg');imshow(im1);  
[m,n,p]=size(im1); 
thet = rand(1); 
m1=m*cos(thet)+n*sin(thet); 
n1=m*sin(thet)+n*cos(thet);  

for i=1:m 
    for j=1:n 
     t = uint16((i-m/2)*cos(thet)-(j-n/2)*sin(thet)+m1/2); 
     s = uint16((i-m/2)*sin(thet)+(j-n/2)*cos(thet)+n1/2); 
     if t~=0 && s~=0   
     im2(t,s,:)=im1(i,j,:); 
     end 
    end 
end 
figure; 
imshow(im2); 

このコードでは、黒点を作成し、問題が補間を行う方法ですか?どんな照明でもありがとうございました。 P.P.組み込み関数を要求しない:imrotate(im1,1/thet、 'nearest');

+0

あなたはフィーチャ回転やのグローバル回転をやろうとしています全体像? – monksy

+0

img全体のグローバルローテーション – MeadowMuffins

答えて

10

黒い斑点なしで画像を回転するには、逆方向に移動する必要があります。

回転行列の逆行列は、その転置行列です。また、回転された画像は、最大45度の回転で常に大きくなります。したがって、sqrt(2)要因

im1 = imread('lena.jpg');imshow(im1); 
[m,n,p]=size(im1); 
thet = rand(1); 
mm = m*sqrt(2); 
nn = n*sqrt(2); 
for t=1:mm 
    for s=1:nn 
     i = uint16((t-mm/2)*cos(thet)+(s-nn/2)*sin(thet)+m/2); 
     j = uint16(-(t-mm/2)*sin(thet)+(s-nn/2)*cos(thet)+n/2); 
     if i>0 && j>0 && i<=m && j<=n   
     im2(t,s,:)=im1(i,j,:); 
     end 
    end 
end 
figure; 
imshow(im2); 
+0

したがって、最近傍補間の一般的な解決法は暗黙的ですか?私は、最も左に見えるピクセルと最も右のピクセルを検出して、ラインごとに補間すると考えました。 – MeadowMuffins

+1

あなたが説明しているのは双線形補間です。近傍の近傍は、最も近いピクセル値 – sjchoi

6

同様の問題があったSOのprevious questionを覚えています。

私が持っていたアイデアは、ピクセルを反対方向にマッピングすることでした。回転された画像内の各ピクセルについて、元の画像内でそれにマップされるピクセルを見つけると、問題はより簡単になる。

私はこの時点でMATLABにアクセスできないが、実行可能だと思う。ここでの難しさは、回転した画像ピクセルをループすることです。

+0

ありがとう、Amro。私が尋ねる前にあなたの前の投稿をチェックしました。マッピングは実際には反対方向です。これにより簡単になります。そして、あなたはただの難しさを感じます。 – MeadowMuffins

+0

+1 - 理想的な解決策です。 – Jacob

+0

これは、最終的な結果には表示されないピクセルの処理を避けるため、通常は回転が行われる方法です。 –

0

すべての変換済みピクセルを取得したら、griddataの黒い点を塗りつぶすことができます。ピクセルの非均一な空間分布(回転したピクセル)とリニア、キュービックまたはに最も近い隣接ピクセルを使用して、必要なピクセル(黒い点)を補間します。

+0

補間を行う機能はまだ組み込まれています。とにかくありがとう、Jacob。 – MeadowMuffins

0
コードの残りの部分は同じまま

黒い斑点は、これらの行によって除去することができます。

im2= zeros(500,500); 
im2(:)=1; 
関連する問題