2009-11-28 21 views
10

Mi Código llano sin interpolación:Cómo rotar Imagen de interpolación por el vecino más cercano en 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); 

Este código crea punto negro, el problema es cómo hacer la interpolación? Gracias a todos por cualquier iluminación. P.S. No solicitando la función incorporada: imrotate (im1,1/thet, 'más cercano');

+0

¿Estás tratando de hacer una rotación característica o una rotación global de la toda la imagen? – monksy

+0

es una rotación global de todo el img – MeadowMuffins

Respuesta

10

Para girar la imagen sin los puntos negros, debe ir en la dirección opuesta.

La inversa de la matriz de rotación es la transposición de la misma. Además, la imagen girada siempre es más grande, con un máximo de rotación de 45 grados. Por lo tanto, los sqrt(2) factor de

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

¿Entonces la solución común de la interpolación del vecino más cercano es implícita? Pensé que detectaría el píxel más visible de la izquierda y el derecho, y luego interpolar línea por línea. – MeadowMuffins

+1

Lo que describes sería una interpolación bilineal. El vecino cercano solo toma el valor de píxel más cercano – sjchoi

6

Recuerdo un previous question en SO que tenía un problema similar.

La idea que tuve fue asignar los píxeles en la dirección opuesta; para cada píxel en la imagen girada, encuentre el píxel (s) que se le asigna en la imagen original, entonces el problema se vuelve mucho más simple.

No tengo acceso a MATLAB en este momento, pero creo que es factible. La dificultad aquí es recorrer los píxeles de la imagen girada.

+0

Gracias, Amro. Verifiqué tu publicación anterior antes de preguntar. El mapeo es de hecho en la dirección opuesta, lo que lo hace más simple. Y solo obtienes mi dificultad. – MeadowMuffins

+0

+1 - por ser la solución ideal – Jacob

+0

Así es como se realiza la rotación, ya que evita el procesamiento de píxeles que de todos modos no son visibles en el resultado final. –

0

Una vez que tenga todos los píxeles transformados, puede completar los puntos negros con griddata que toma una distribución espacial no uniforme de píxeles (sus píxeles girados) y interpola los píxeles requeridos (sus puntos negros) usando lineal, cúbico o vecino más cercano.

+0

Aún está incorporada para hacer interpolación. Gracias de todos modos, Jacob. – MeadowMuffins

0

Manchas negras pueden eliminarse mediante estas líneas, mientras que el resto del código sigue siendo igual:

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