Matlabを使用して最近傍内挿によって画像を回転させる方法
-
06-07-2019 - |
質問
補間なしのプレーンコード:
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);
このコードはブラックスポットを作成します。問題は補間の方法ですか?照明をありがとうございました。 追伸組み込み関数を要求しない:imrotate(im1,1 / thet、 'nearest');
解決
黒い斑点のない画像を回転するには、逆方向に移動する必要があります。
回転行列の逆行列は転置行列です。また、回転した画像は常に最大で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);
他のヒント
SOに関する前の質問を覚えています同様の問題。
考えていたのは、ピクセルを反対方向にマッピングすることでした。回転した画像の各ピクセルについて、元の画像でそれに対応するピクセルを見つければ、問題ははるかに簡単になります。
現時点では、MATLABにアクセスできませんが、実行可能だと思います。ここでの困難は、回転した画像ピクセルをループすることです。
変換されたピクセルがすべて揃ったら、 griddata
ピクセルの不均一な空間分布(回転したピクセル)を取り込み、線形、キュービック、または最近傍。
ブラックスポットはこれらの行で削除できますが、残りのコードは同じままです:
im2= zeros(500,500);
im2(:)=1;
所属していません StackOverflow