Wie die Bilder von Nearest Neighbor Interpolation Drehen Matlab
-
06-07-2019 - |
Frage
Mein Plain-Code ohne Interpolation:
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);
Dieser Code erstellt schwarzen Fleck, das Problem ist, wie Interpolation zu tun? Vielen Dank für jede Beleuchtung. P. S. Nicht fragen, build-in-Funktion: imrotate (im1,1 / Thet, 'nächste');
Lösung
Um das Bild zu drehen, ohne die schwarzen Flecke, müssen Sie in der umgekehrten Richtung gehen.
Die Inverse der Rotationsmatrix die Transponierte davon. Auch das gedrehte Bild ist immer größer mit maximal seiner 45-Grad-Drehung. Daher ist der sqrt(2)
Faktor
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);
Andere Tipps
Ich erinnere mich an eine vorherige Frage auf, so dass hatte ein ähnliches Problem.
Die Idee, die ich hatte, war die Pixel in die entgegengesetzte Richtung zu kartieren; für jedes Pixel in dem gedrehten Bild, das Pixel (s), die im Originalbild, um es abbildet, dann wird das Problem viel einfacher.
Ich habe keinen Zugriff auf MATLAB in diesem Moment, aber ich denke, es ist machbar. Die Schwierigkeit dabei ist, Schleifen über die gedrehten Bildpixel ..
Wenn Sie alle transformierten Pixel haben, können Sie in den schwarzen Flecken mit griddata
, die in einer ungleichmßigen räumlichen Verteilung der Bildpunkte (Pixel gedreht Ihre) hat und interpoliert die erforderlichen Pixel (Ihre schwarze Flecken) linear verwenden, kubisch oder nächster-Nachbar .
Schwarze Flecken können durch diese Linien entfernt werden, während der Rest des Codes bleibt gleich:
im2= zeros(500,500);
im2(:)=1;