Pergunta

Meu código Plain sem interpolação:

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 cria mancha negra, o problema é como fazer interpolação? Obrigado a todos por qualquer iluminação. P. S. Não pedir build-in função: imrotate (im1,1 / thet, 'mais próximo');

Foi útil?

Solução

Para rodar a imagem sem as manchas pretas, você precisa ir na direção inversa.

O inverso da matriz de rotação é a transposta do mesmo. Além disso, a imagem rodada é sempre maior com a máxima ser de 45 graus de rotação. Assim, o fator 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);

Outras dicas

Lembro-me de um anterior pergunta no SO que tinha um problema semelhante.

A idéia que eu tinha era para mapear os pixels na direção oposta; para cada pixel da imagem rodada, encontrar o pixel (s) que mapeia para ele na imagem original, então o problema torna-se muito mais simples.

Eu não tenho acesso ao MATLAB neste momento, mas eu acho que é factível. A dificuldade aqui é looping sobre os pixels da imagem girada ..

Depois de ter todos os pixels transformados, você pode preencher as manchas pretas com griddata que leva em uma distribuição espacial não uniforme de pixels (seus pixels girado) e interpola os pixels necessários (seus pontos negros) usando linear, cúbico ou -vizinho mais próximo .

Manchas pretas podem ser removidos por estas linhas, enquanto o resto do código permanece igual:

im2= zeros(500,500);
im2(:)=1;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top