2009-11-28 4 views
10

My Code Plain senza interpolazione:Come per ruotare l'immagine per interpolazione del vicino più vicino Utilizzo di 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); 

Questo codice crea macchia nera, il problema è come fare l'interpolazione? Grazie a tutti per l'illuminazione. P.S. Non chiedere la funzione build-in: imrotate (im1,1/thet, 'nearest');

+0

Stai cercando di fare una rotazione caratteristica o una rotazione globale del intera immagine? – monksy

+0

è una rotazione globale dell'intera img – MeadowMuffins

risposta

10

Per ruotare l'immagine senza punti neri, è necessario andare nella direzione opposta.

L'inverso della matrice di rotazione è la trasposizione di esso. Inoltre, l'immagine ruotata è sempre più grande con una rotazione massima di 45 gradi. Quindi, i sqrt(2) fattore

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

Quindi la risoluzione comune dell'interpolazione del vicino più vicino è implicita? Ho pensato che avrebbe rilevato il pixel più visibile a sinistra e quello più a destra, e quindi interpolato linea per linea. – MeadowMuffins

+1

Quello che descriveresti sarebbe un'interpolazione bilineare. Vicino al vicino prende solo il valore di pixel più vicino – sjchoi

6

Mi ricordo di un previous question su SO che ha avuto un problema simile.

L'idea che avevo era quella di mappare i pixel nella direzione opposta; per ogni pixel nell'immagine ruotata, trova il/i pixel ad esso associato nell'immagine originale, quindi il problema diventa molto più semplice.

Non ho accesso a MATLAB in questo momento, ma penso che sia fattibile. La difficoltà qui è il looping sui pixel dell'immagine ruotata.

+0

Grazie, Amro. Ho controllato il tuo post precedente prima che lo chiedessi. La mappatura è davvero nella direzione opposta, che lo rende più semplice. E tu hai solo difficoltà. – MeadowMuffins

+0

+1 - per essere la soluzione ideale – Jacob

+0

In questo modo viene normalmente eseguita la rotazione poiché evita l'elaborazione di pixel che non sono comunque visibili nel risultato finale. –

0

Una volta che tutti i pixel trasformati, è possibile riempire i punti neri con griddata che accetta una distribuzione spaziale di pixel non uniforme (i pixel ruotati) e interpola i pixel richiesti (i punti neri) usando lineare, cubico o vicino di casa.

+0

Tuttavia, è ancora incorporata la funzione di interpolazione. Grazie comunque, Jacob. – MeadowMuffins

0

Macchie nere possono essere rimossi da queste linee, mentre il resto del codice rimane lo stesso:

im2= zeros(500,500); 
im2(:)=1;