Pregunta

Mi código liso sin interpolación:

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 un punto negro, el problema es cómo hacer la interpolación. Gracias a todos por cualquier iluminación. PD No se solicita la función incorporada: imrotate (im1,1 / thet, 'la más cercana');

¿Fue útil?

Solución

Para rotar la imagen sin los puntos negros, debes ir en la dirección inversa.

Lo inverso de la matriz de rotación es su transposición. Además, la imagen girada siempre es más grande, con una rotación máxima de 45 grados. Por lo tanto, el factor 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);

Otros consejos

Recuerdo una pregunta anterior sobre SO que tenía un problema similar.

La idea que tuve fue mapear los píxeles en la dirección opuesta; para cada píxel en la imagen rotada, encuentre el (los) píxel (es) 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 hacer un bucle sobre los píxeles de la imagen girada ...

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

Las manchas negras se pueden eliminar con estas líneas, mientras que el resto del código sigue siendo el mismo:

im2= zeros(500,500);
im2(:)=1;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top