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');

War es hilfreich?

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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top