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);
4 Réponses :
Je me souviens d'un Question précédente sur ce que cela avait un problème similaire. p>
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. P>
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 .. p>
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?
Une fois que vous avez tous les pixels transformés, vous pouvez remplir les taches noires avec GridData code>
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
Il est toujours intégré à l'interpolation, cependant. Merci quand même, Jacob.
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) code> facteur p>
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
Les taches noires peuvent être supprimées par ces lignes, tandis que le reste du code reste le même:
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