12
votes

Comment faire pivoter l'image par interpolation voisine la plus proche à l'aide de MATLAB

Mon code uni sans 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);


2 commentaires

Essayez-vous de faire une rotation de la fonctionnalité ou une rotation globale de l'image entière?


C'est une rotation globale de l'ensemble de l'IMG


4 Réponses :


6
votes

Je me souviens d'un Question précédente sur ce que cela avait un problème similaire.

L'idée que j'avais était de mapper les pixels dans la direction opposée; Pour chaque pixel dans l'image pivotée, trouvez le (s) pixel (s) qui en mappe dans l'image d'origine, puis le problème devient beaucoup plus simple.

Je n'ai pas accès à Matlab en ce moment, mais je pense que c'est faisable. La difficulté ici est en boucle sur les pixels d'image tournés ..


3 commentaires

Merci, amro. J'ai vérifié votre post précédent avant de demander. La cartographie est en effet dans la direction opposée, ce qui le rend plus simple. Et vous venez d'obtenir ma difficulté.


C'est ainsi que la rotation est généralement effectuée car elle évite de traiter les pixels qui ne sont pas visibles dans le résultat final.


Cela fait un certain temps mais quelqu'un a une implémentation plus rapide au problème de rotation, semblable à celle faite dans ce lien?



0
votes

Une fois que vous avez tous les pixels transformés, vous pouvez remplir les taches noires avec GridData qui prend une distribution spatiale non uniforme de pixels (vos pixels pivotants) et interpolate les pixels requis (vos taches noires) à l'aide de linéaire, cubique ou voisin le plus proche .


1 commentaires

Il est toujours intégré à l'interpolation, cependant. Merci quand même, Jacob.



11
votes

Pour faire pivoter l'image sans les taches noires, vous devez aller dans la direction inverse.

L'inverse de la matrice de rotation est la transposition de celle-ci. En outre, l'image en rotation est toujours plus grande avec une rotation maximale de 45 degrés. Par conséquent, le sqrt (2) facteur xxx


2 commentaires

La résolution commune de l'interpolation voisine la plus proche est-elle implicite? Je pensais qu'il détecterait le pixel le plus visible gauche et le plus bas, puis d'interpoler la ligne par ligne.


Ce que vous décrivez serait une interpolation bilinéaire. Près du voisin prend juste la valeur de pixel la plus proche



0
votes

Les taches noires peuvent être supprimées par ces lignes, tandis que le reste du code reste le même: xxx


0 commentaires