Ce qu'on appelle l'angle de rotation. Conception par profil

Faire pivoter une image raster selon des angles multiples de 90° par rapport au centre géométrique de l'image est une tâche triviale et peut être résolue sans perte de qualité en transformant simplement les coordonnées de chaque pixel.

Ci-dessous, nous examinerons un algorithme de rotation précise d'une image raster selon un angle arbitraire par rapport à un centre arbitraire avec des pertes minimales.

J'exprime ma gratitude à Vladislav Vladimirovitch Kharchenko pour l'aide apportée.

Algorithme

De la figure ci-dessus, on peut voir qu'après rotation de l'image raster, la couleur de chaque pixel de l'image finale est déterminée en ajoutant les couleurs de plusieurs « fragments » de plusieurs pixels de l'image originale, proportionnellement aux zones de l'image correspondante. des « fragments ». Par conséquent, en termes généraux, la solution à notre problème sera de trouver les aires de tous les « fragments » pour chaque pixel de l'image originale et de collecter la couleur de chaque pixel de l'image finale à partir des couleurs des « fragments » correspondants.

Comme modèle pixel de l'image originale, nous utiliserons un carré de côté = 1, avec les notations suivantes pour les coins :
i1 - coin le plus à droite ;
i2 - coin le plus bas ;
i3 - coin le plus à gauche ;
i4 est le coin le plus haut.

Le modèle d'image final sera une grille de lignes horizontales et verticales parallèles avec une distance entre les lignes = 1.

Les coordonnées du centre de rotation de l'image raster, dans cette représentation, peuvent être exprimées sous la forme d'une paire de nombres réels arbitraires. Autrement dit, le centre de rotation dans notre problème peut se situer non pas au centre géométrique du pixel ni au point d'intersection des lignes de la grille, mais en un point arbitraire des coordonnées cartésiennes.

Puisque lorsqu'une image raster est tournée, le carré de chaque pixel est tourné du même angle (par rapport au centre de ce pixel), nous allons résoudre le problème pour un pixel, puis appliquer la solution résultante à chaque pixel de l'original. image.

La rotation d'un bitmap peut être divisée en deux parties :
1. Faites pivoter le carré de chaque pixel de l'image originale par rapport au centre de ce carré d'un angle donné.
2. Déplacement du centre du carré du pixel en fonction de l'angle de rotation de l'image par rapport au centre de rotation de l'image pour que le carré prenne sa position finale sur la grille de l'image finale.
Dans ce cas, la grille de l'image finale découpe le carré de chaque pixel de l'image originale en « fragments » à raison de 4, 5 ou 6 morceaux.

Pour systématiser la variété des options résultantes, j'ai dû créer une taxonomie de toutes les intersections possibles du carré de pixels de l'image originale avec la grille de l'image finale. Il n’y avait que 23 options significativement différentes :


Les conventions ici sont les suivantes :
- les nombres dans les cellules indiquent les numéros des coins du carré de pixels tombés dans une cellule donnée de la grille d'image finale après rotation de l'image ;
- la couleur verte indique les cellules dans lesquelles des parties du pixel sont tombées et sont garanties d'y laisser un « éclat » ;
- le jaune indique les alvéoles dans lesquelles, selon les conditions, peut frapper (ou ne pas toucher) des « fragments » du carré de pixels, formés non pas par les coins du carré, mais par les côtés du carré.

Pour plus de clarté, je donnerai une des variantes possibles de l'option n°3 :

Comme vous pouvez le constater, la cellule supérieure droite ne contient pas de « fragment » de pixel, bien que cela puisse l'être dans d'autres conditions de rotation.
Afin de ne pas alourdir le lecteur avec des calculs géométriques détaillés, je dirai tout de suite que dans toutes ces 23 options, le pixel de l'image originale est découpé en « fragments », dont l'aire se calcule facilement en combinant 4 formules . Vous trouverez ci-dessous ces formules avec des illustrations. La couleur rouge indique les lignes de grille de l'image finale qui traversent le carré de pixels. La zone dont l'aire est calculée par la formule est ombrée en jaune.

Formule 1
Cette formule n'est pas utilisée pour calculer l'aire finale du « fragment », mais elle est pratique à utiliser pour calculer rapidement les zones intermédiaires auxiliaires, puisque l'on sait que l'aire du pixel entier = 1.
Les hauteurs déposées des coins du carré sur la grille de l'image finale sont utilisées comme variables d'entrée dans toutes les formules, pour la simple raison que le calcul de ces hauteurs revient à sélectionner instantanément la partie fractionnaire de la valeur numérique de la coordonnée. du coin correspondant du carré du pixel.

Formule 2

Cette formule est utilisée uniquement dans les options 1 et 2.

Formule 3
Une formule fréquemment utilisée - l'avantage est qu'elle est rapidement calculée. Étant donné que l'angle de rotation est le même pour chaque pixel, toutes les fonctions trigonométriques peuvent être calculées une fois, avant de traiter tous les pixels, puis utiliser ces valeurs dans la boucle comme constantes.

Formule 4
Cette formule est calculée en deux étapes. Tout d’abord, l’expression entre parenthèses est évaluée. Si la valeur est positive, la surface est calculée. Si la valeur est négative, cela signifie que « l’éclat » formé par le coin de la grille et le côté du carré n’est pas coupé du pixel et qu’il ne sert à rien d’effectuer d’autres calculs.

En tenant compte de tout ce qui précède, l'algorithme ressemblera en général à ceci :
1. Chargez l'image originale dans la mémoire de l'ordinateur.
2. Calculez les dimensions de l'image finale en pixels.
3. Créez un tableau bidimensionnel intermédiaire, dont chaque élément contient 3 composants de couleur RVB au format de nombres à virgule flottante. Les dimensions du tableau sont égales aux dimensions de l'image finale.
4. Parcourez séquentiellement tous les pixels de l’image source ; on fait pivoter chacun d'eux d'un angle donné et on les place sur la grille de l'image finale, en calculant les 4 coordonnées des coins du carré de pixel ; nous classons le pixel en 23 options et comptons les zones des « fragments » ; Nous ajoutons les couleurs des « fragments » résultants aux éléments correspondants du tableau intermédiaire proportionnellement à la surface de ces « fragments ».
5. Après avoir traité tous les pixels de l'image originale, nous arrondissons les valeurs RVB du tableau intermédiaire à une valeur entière pour chaque élément et créons l'image finale au format BMP sur la base de ces valeurs entières.

Programme

Sur la base de l'algorithme ci-dessus, un programme pour Windows a été écrit. Les codes sources d'Object Pascal et le fichier exécutable compilé peuvent être téléchargés.

Interface du programme.
Cliquer sur le bouton « Ouvrir » ouvre une boîte de dialogue de sélection de fichier BMP. Seuls les bitmaps avec une palette de 24 bits sont pris en charge. L'image ouverte est affichée dans une fenêtre. Le titre de la fenêtre affiche le chemin complet du fichier et les dimensions de l'image.

Dans le champ « Angle », spécifiez l'angle de rotation en degrés – n'importe quel nombre positif.
Un point ou une virgule peut être utilisé comme séparateur décimal lors de la saisie de nombres fractionnaires.

Les boutons radio « CW » et « CCW » règlent le sens de rotation : respectivement « dans le sens des aiguilles d'une montre » et « dans le sens inverse des aiguilles d'une montre ».

Dans le bloc « Couleur de fond », vous pouvez définir la couleur de fond avec laquelle les pixels de bordure de l'image seront mélangés. La couleur d'arrière-plan par défaut est le noir.

Dans les champs « Centre X » et « Centre Y », sont précisées les coordonnées du centre de rotation. Il faut tenir compte du fait que l'origine des coordonnées se trouve dans le coin supérieur gauche de l'image et Y augmente vers le bas. Par défaut, le centre de rotation est défini sur le centre géométrique de l'image chargée.

En cliquant sur le bouton « Rotation » ou en appuyant sur la touche Entrée, l'image est pivotée d'un angle spécifié par rapport au centre de rotation spécifié et affichée dans la fenêtre. La rotation de l'image selon des angles multiples de 90° est réalisée selon un schéma simplifié, en transformant simplement les coordonnées en pixels de l'image originale, tandis que les valeurs « Centre X » et « Centre Y » sont ignorées.
Le temps de fonctionnement de l'algorithme en secondes est affiché sous le bouton « Rotation ».

À l'aide du bouton « Enregistrer... », l'image pivotée peut être enregistrée dans un fichier BMP.

Si l'image finale ne rentre pas dans la fenêtre, elle est ajustée aux bordures de la fenêtre à l'aide de la fonction API StretchBlt. Par conséquent, la qualité réelle des grandes images ne peut être évaluée qu'à l'aide du fichier BMP enregistré.
Pour faire pivoter une image sous un angle différent, vous n'avez pas besoin de la recharger : c'est l'image du fichier sélectionné qui est pivotée, et non celle actuellement affichée dans la fenêtre.

Une image aux dimensions de 1024 x 768 sur une machine équipée d'un processeur quadricœur de 2,67 GHz est tournée par ce programme selon un angle arbitraire, en moyenne en environ 0,5 seconde. Une image aux dimensions de 4000 x 4000 - en 10 secondes environ. Le temps de fonctionnement de l'algorithme pour différents angles peut différer en raison du fait que l'image sous différents angles est divisée en un nombre différent de « fragments », le temps total passé à calculer les zones de ces fragments est en conséquence différent.

Le tableau intermédiaire contenant des informations sur la couleur des pixels de l'image finale au format à virgule flottante est implémenté sur le type étendu (10 octets), donc le traitement de grandes images (environ plus de 5 000 x 5 000 pixels) peut provoquer une erreur de dépassement de mémoire. Il est possible d'améliorer la situation en utilisant un type de données moins précis et en enregistrant la partie entière du nombre directement dans le bitmap final, en ne laissant que la partie fractionnaire dans le tableau auxiliaire.

Résultats

Faisons une analyse comparative du fonctionnement de l'algorithme de précision et de l'algorithme de rotation d'image implémenté dans Photoshop.
Essai 1
Pour le premier test, j'ai pris une image très simple - une ligne noire horizontale de 1 pixel d'épaisseur et 10 pixels de long, décalée par rapport au centre d'un carré blanc de dimensions 100 x 100 pixels :

Après quoi j'ai fait pivoter cette image par rapport au point de coordonnées (0, 0) de 3° dans le sens des aiguilles d'une montre. Le point (0, 0) a été choisi car, d'après mes expériences, Photoshop fait pivoter l'image par rapport à ce point. Voici le résultat comparatif (zoomé 24x) :

Algorithme de précision

Photoshop 7.0.1

Photoshop CS6 (64 bits)
L'algorithme Photoshop produit une image plus contrastée, tandis que l'algorithme de précision « brouille » quelque peu l'image. Mais en général, avec une évaluation visuelle, le résultat est quasiment le même. Au passage, notons que l'algorithme de rotation implémenté dans Photoshop n'a pas subi d'évolution significative depuis 10 ans.

Essai 2
Pour le deuxième test, j'ai choisi Tulip de la distribution standard Win7 :

Après avoir fait pivoter cette image de 5° dans le sens des aiguilles d'une montre par rapport au centre géométrique, j'ai additionné la couleur de tous les pixels en termes de canaux RVB. Voici le résultat pour l'algorithme de précision et l'algorithme Photoshop :
Les chiffres entre parenthèses indiquent l'écart absolu de cet indicateur par rapport à l'original.
La couleur de l'image après une rotation de précision et avant l'arrondi n'a pratiquement pas changé - ce qui était prévisible.
Le plus grand écart, dans ce cas particulier, se trouve dans le canal G de l'algorithme Photoshop. En pourcentage, cet écart n’est que de 0,06 %, il n’est donc pas perceptible « à l’œil nu », mais pour des raisons de perfectionnisme, le résultat de Photoshop est pire que celui d’un algorithme de précision.
Il est important de noter qu'arrondir la couleur de chaque pixel dans l'algorithme de précision à la valeur entière requise par le format BMP détruit de manière irréversible une partie des informations de couleur.

Pour une comparaison visuelle des deux algorithmes, je vais donner un fragment agrandi de l'image,

Rotation de 5° dans le sens des aiguilles d'une montre, respectivement, Photoshop :

Et avec un algorithme de précision :

L'analyse comparative montre que Photoshop parvient mieux à préserver les éléments contrastés de l'image, tout en créant des « halos » de couleurs déformées. L'algorithme de précision ne déforme pas la couleur, mais en même temps « brouille » quelque peu l'image.

Conclusions

1. Une rotation précise et en même temps relativement rapide d'une image raster selon un angle arbitraire est possible. Cela reste un mystère pour moi pourquoi les éditeurs graphiques professionnels ne disposent pas d'une option permettant à l'utilisateur de faire pivoter une image avec une extrême précision en un peu plus de temps.

2. Malgré l'extrême précision de l'algorithme considéré, la transformation d'image inverse, c'est-à-dire La rotation vers l'angle opposé sans perte de qualité est impossible car l'arrondi de la valeur de couleur exacte (au format virgule flottante) détruit de manière irréversible certaines informations de couleur.

3. Du point de vue de la perception visuelle des détails contrastés, le meilleur résultat est obtenu par l'algorithme sous-optimal de Photoshop. Il est logique d'utiliser un algorithme de précision dans les cas où il est important de conserver un maximum d'informations sur la couleur de l'image.

MISE À JOUR : Pour une utilisation pratique, j'ai écrit un programme qui implémente un algorithme simplifié dans lequel, pour chaque pixel de l'image finale, tous les éléments de pixels nécessaires dans l'image originale sont calculés séquentiellement et l'arrondi des couleurs se produit immédiatement. Ce n'est qu'après cela que le pixel suivant de l'image finale est calculé. Dans ce cas, le programme accède plusieurs fois à un seul pixel de l’image source. Le temps de calcul a ainsi augmenté en moyenne de 1,7 fois, mais la mémoire de cette version de l'algorithme est consacrée uniquement au stockage des bitmaps, ce qui permet de travailler avec des images de grande taille. Vous pouvez télécharger le programme et les sources


Un concept important en trigonométrie est angle de rotation. Ci-dessous, nous donnerons systématiquement une idée du virage et présenterons tous les concepts associés. Commençons par une idée générale d'un tour, disons une rotation complète. Passons ensuite au concept d'angle de rotation et considérons ses principales caractéristiques, telles que la direction et l'ampleur de la rotation. Enfin, nous donnons la définition de la rotation d'une figure autour d'un point. Nous fournirons l'intégralité de la théorie dans le texte avec des exemples explicatifs et des illustrations graphiques.

Navigation dans les pages.

Qu'appelle-t-on la rotation d'un point autour d'un point ?

Notons immédiatement qu'à côté de l'expression « rotation autour d'un point », nous utiliserons également les expressions « rotation autour d'un point » et « rotation autour d'un point », qui signifient la même chose.

Présentons concept de tourner un point autour d'un point.

Tout d’abord, définissons le centre de rotation.

Définition.

Le point autour duquel la rotation s'effectue est appelé centre de rotation.

Disons maintenant ce qui se passe suite à la rotation du point.

À la suite de la rotation d'un certain point A par rapport au centre de rotation O, un point A 1 est obtenu (qui, dans le cas d'un certain nombre, peut coïncider avec A), et le point A 1 se trouve sur un cercle avec un centre au point O de rayon OA. En d'autres termes, lors d'une rotation par rapport au point O, le point A va au point A 1 situé sur un cercle dont le centre est le point O de rayon OA.

On pense que le point O, en tournant sur lui-même, se transforme en lui-même. Autrement dit, à la suite d'une rotation autour du centre de rotation O, le point O se transforme en lui-même.

Il convient également de noter que la rotation du point A autour du point O doit être considérée comme un déplacement résultant du mouvement du point A dans un cercle de centre au point O de rayon OA.

Pour plus de clarté, nous allons donner une illustration de la rotation du point A autour du point O ; dans les figures ci-dessous, nous montrerons le mouvement du point A vers le point A 1 à l'aide d'une flèche.

Tour complet

Il est possible de faire pivoter le point A par rapport au centre de rotation O, de telle sorte que le point A, ayant dépassé tous les points du cercle, soit au même endroit. Dans ce cas, on dit que le point A s’est déplacé autour du point O.

Donnons une illustration graphique d'une révolution complète.

Si vous ne vous arrêtez pas à un tour, mais continuez à déplacer la pointe autour du cercle, vous pouvez alors effectuer deux, trois, etc. tours complets. Le dessin ci-dessous montre comment effectuer deux tours complets à droite et trois tours à gauche.


Notion d'angle de rotation

D’après le concept de rotation d’un point introduit dans le premier paragraphe, il est clair qu’il existe un nombre infini d’options pour faire pivoter le point A autour du point O. En effet, tout point d'un cercle ayant pour centre le point O de rayon OA peut être considéré comme le point A 1 obtenu grâce à la rotation du point A. Par conséquent, pour distinguer un tour d’un autre, nous introduisons notion d'angle de rotation.

L'une des caractéristiques de l'angle de rotation est sens de rotation. Le sens de rotation détermine si le point tourne dans le sens horaire ou antihoraire.

Une autre caractéristique de l'angle de rotation est sa ampleur. Les angles de rotation sont mesurés dans les mêmes unités que : les degrés et les radians sont les plus courants. Il convient de noter ici que l'angle de rotation peut être exprimé en degrés par n'importe quel nombre réel allant de moins l'infini à plus l'infini, contrairement à l'angle en géométrie dont la valeur en degrés est positive et ne dépasse pas 180.

Les lettres minuscules de l'alphabet grec sont généralement utilisées pour indiquer les angles de rotation : etc. Pour désigner un grand nombre d'angles de rotation, une lettre avec des indices est souvent utilisée, par exemple, .

Parlons maintenant des caractéristiques de l'angle de rotation plus en détail et dans l'ordre.

Sens de rotation

Soit les points A et A 1 marqués sur un cercle dont le centre est le point O. Vous pouvez accéder au point A 1 à partir du point A en tournant autour du centre O dans le sens des aiguilles d'une montre ou dans le sens inverse. Il est logique de considérer ces virages comme différents.

Illustrons les rotations dans un sens positif et négatif. Le dessin ci-dessous montre la rotation dans le sens positif à gauche et dans le sens négatif à droite.

Valeur de l'angle de rotation, angle de valeur arbitraire

L'angle de rotation d'un point autre que le centre de rotation est entièrement déterminé en indiquant sa grandeur, par contre, par la grandeur de l'angle de rotation on peut juger de la manière dont cette rotation s'est effectuée.

Comme nous l'avons mentionné ci-dessus, l'angle de rotation en degrés est exprimé sous la forme d'un nombre compris entre −∞ et +∞. Dans ce cas, le signe plus correspond à une rotation dans le sens des aiguilles d’une montre, et le signe moins correspond à une rotation dans le sens inverse des aiguilles d’une montre.

Reste maintenant à établir une correspondance entre la valeur de l'angle de rotation et la rotation à laquelle il correspond.

Commençons par un angle de rotation de zéro degré. Cet angle de rotation correspond au mouvement du point A vers lui-même. En d’autres termes, lors d’une rotation de 0 degré autour du point O, le point A reste en place.

On procède à la rotation du point A autour du point O, dans laquelle la rotation se produit en un demi-tour. Nous supposerons que le point A va au point A 1. Dans ce cas, la valeur absolue de l'angle AOA 1 en degrés ne dépasse pas 180. Si la rotation s'est produite dans un sens positif, alors la valeur de l'angle de rotation est considérée comme égale à la valeur de l'angle AOA 1, et si la rotation s'est produite dans un sens négatif, alors sa valeur est considérée comme égale à la valeur de l'angle AOA 1 avec un signe moins. A titre d'exemple, voici une image montrant des angles de rotation de 30, 180 et −150 degrés.


Les angles de rotation supérieurs à 180 degrés et inférieurs à −180 degrés sont déterminés sur la base des éléments suivants, assez évidents : propriétés des tours successifs: plusieurs rotations successives du point A autour du centre O équivalent à une rotation dont la grandeur est égale à la somme des grandeurs de ces rotations.

Donnons un exemple illustrant cette propriété. Faisons pivoter le point A par rapport au point O de 45 degrés, puis faisons pivoter ce point de 60 degrés, après quoi nous faisons pivoter ce point de -35 degrés. Notons les points intermédiaires lors de ces tours comme A 1, A 2 et A 3. Nous pourrions arriver au même point A 3 en effectuant une rotation du point A selon un angle de 45+60+(−35)=70 degrés.

Ainsi, nous représenterons les angles de rotation supérieurs à 180 degrés comme plusieurs tours successifs par angles dont la somme donne la valeur de l'angle de rotation d'origine. Par exemple, un angle de rotation de 279 degrés correspond à des rotations successives de 180 et 99 degrés, soit 90, 90, 90 et 9 degrés, ou 180, 180 et -81 degrés, soit 279 rotations successives de 1 degré.

Les angles de rotation inférieurs à −180 degrés sont déterminés de la même manière. Par exemple, un angle de rotation de −520 degrés peut être interprété comme des rotations successives du point de −180, −180 et −160 degrés.

Résumons-le. Nous avons déterminé l'angle de rotation dont la valeur en degrés est exprimée par un nombre réel compris dans l'intervalle de −∞ à +∞. En trigonométrie, nous travaillerons spécifiquement avec les angles de rotation, bien que le mot « rotation » soit souvent omis et qu'ils disent simplement « angle ». Ainsi, en trigonométrie, nous travaillerons avec des angles de grandeur arbitraire, c'est-à-dire les angles de rotation.

Pour conclure ce point, notons qu'une rotation complète dans le sens positif correspond à un angle de rotation de 360 ​​degrés (ou 2 π radians), et dans un sens négatif - un angle de rotation de −360 degrés (ou −2 π rad). . Dans ce cas, il est pratique de représenter les grands angles de rotation comme un certain nombre de tours complets et une autre rotation selon un angle compris entre -180 et 180 degrés. Par exemple, prenons un angle de rotation de 1 340 degrés. Il est facile d'imaginer 1 340 comme 360·4+(−100) . Autrement dit, l'angle de rotation initial correspond à 4 tours complets dans le sens positif et à une rotation ultérieure de -100 degrés. Autre exemple : un angle de rotation de −745 degrés peut être interprété comme deux tours dans le sens inverse des aiguilles d'une montre suivis d'une rotation de −25 degrés, puisque −745=(−360) 2+(−25) .

Faire pivoter une forme autour d'un point d'un angle

Le concept de rotation de points est facilement étendu à faire pivoter n'importe quelle forme autour d'un point d'un angle(nous parlons d'une rotation telle que le point autour duquel la rotation est effectuée et la figure qui tourne se trouvent dans le même plan).

Par rotation d'une figure, nous entendons la rotation de tous les points de la figure autour d'un point donné d'un angle donné.

A titre d'exemple, illustrons l'action suivante : faites pivoter le segment AB d'un angle par rapport au point O ; ce segment, une fois tourné, entrera dans le segment A 1 B 1.

Références.

  • Algèbre: Manuel pour la 9ème année. moy. école/Yu. N. Makarychev, N. G. Mindyuk, K. I. Neshkov, S. B. Suvorova ; Éd. S. A. Telyakovsky.- M. : Éducation, 1990.- 272 p. : ill.- isbn 5-09-002727-7
  • Bashmakov M.I. Algèbre et débuts de l'analyse : Manuel. pour les classes 10-11. moy. école - 3e éd. - M. : Éducation, 1993. - 351 p. : ill. - ISBN5-09-004617-4.
  • Algèbre et le début de l'analyse : Proc. pour les classes 10-11. enseignement général institutions / A. N. Kolmogorov, A. M. Abramov, Yu. P. Dudnitsyn et autres ; Éd. A. N. Kolmogorov - 14e éd. - M. : Éducation, 2004. - 384 pp. : ill.
  • Gusev V.A., Mordkovitch A.G. Mathématiques (un manuel pour ceux qui entrent dans les écoles techniques) : Proc. allocation.- M.; Plus haut école, 1984.-351 p., ill.

INTRODUCTION ÉNONCÉ DU PROBLÈME.

1. DESCRIPTION DE L'ALGORITHME DE ROTATION DE L'IMAGE

2. DÉVELOPPEMENT D'APPLICATIONS EN LANGAGE DE PROGRAMMATION C#

2.1 Description de la demande

2.2 Tester l'application

CONCLUSION

LISTE DES SOURCES UTILISÉES

ANNEXE A

INTRODUCTION ÉNONCÉ DU PROBLÈME

Dans le cadre de l'étude de la discipline « Acquisition et traitement d'images », à titre de test, la tâche a été fixée de décrire l'algorithme et de mettre en œuvre la fonction de rotation de l'image autour du centre selon un angle spécifié par l'utilisateur. Calculez une fois le cosinus et le sinus d’un angle. Définissez arbitrairement tous les paramètres initiaux et vérifiez le respect de la plage de valeurs acceptables.

1 . Description de l'algorithme de rotation d'image

Pour faire pivoter une image d’un angle spécifié en degrés, utilisez la fonction privée Bitmap RotateImage(Bitmap Image, int angle).

Paramètres d'entrée :

Image bitmap - image à faire pivoter ;

angle int - angle de rotation en degrés.

La fonction renvoie une image pivotée d'un angle donné.

Algorithme de fonction :

1) L'entrée est l'image et l'angle de rotation en degrés ;

2) Calculez le sinus et le cosinus de l'angle de rotation (une fois). L'angle de rotation est spécifié en radians ;

3) Calculez la nouvelle largeur et hauteur de l'image en utilisant le sinus et le cosinus calculés de l'angle de rotation ;

4) Initialisation d'un tableau de structures de stand de tir Point (Point points = new Point), qui définissent un parallélogramme.

5) En fonction de l'angle de rotation (dans quel quart il se situe en radians), les coordonnées de trois points sont calculées pour construire une nouvelle image. Les coordonnées sont calculées à partir du point (3) de cet algorithme (nouvelles largeur et hauteur - recalcul des coordonnées X et Y des points) ;

6) Dessiner l'image pivotée en utilisant trois points (coins supérieur gauche, supérieur droit et inférieur gauche du parallélogramme. Le quatrième point est extrapolé sur la base des trois premiers).

g.DrawImage(Image, points); - fonction de dessin.

7) Renvoyez l’image pivotée pour une utilisation en dehors de cette fonction.

Le centrage de l'image est effectué par la propriété de l'élément PictureBox1.SizeMode = PictureBoxSizeMode.CenterImage ;

2 . DÉVELOPPEMENT D'APPLICATIONS EN LANGAGE DE PROGRAMMATION C#

MS Visual Studio 2012 a été choisi comme outil de développement pour l'application de traitement d'image. C# a été choisi comme langage de programmation. Cette boîte à outils offre une gamme suffisante de possibilités pour travailler avec des graphiques.

Une application a été développée en fonction de la tâche.

2. 1 Description de l'application

faire pivoter la plage d'angles de l'image

L'application est basée sur la classe frmRotationForm.

Cette classe implémente les méthodes suivantes :

La méthode private void btnRotateImage_Click(object sender, EventArgs e) gère le clic sur le bouton « faire pivoter l’image ». Après avoir cliqué, une tentative est faite pour convertir le contenu du champ de texte en nombre (pour une utilisation ultérieure comme variable ang, conçue pour stocker l'angle de rotation en degrés). Cette méthode gère également les exceptions et lance la fonction RotateImage, qui fait pivoter l'image.

La méthode privée Bitmap RotateImage(Bitmap Image, int angle) fait pivoter l’image d’un angle donné. Renvoie une image pivotée.

La méthode private void btnLoadImage_Click(object sender, EventArgs e) charge une image du disque dans une PictureBox avec l'image d'origine.

La méthode private void timer1_Tick(object sender, EventArgs e) est exécutée pour chaque tick de minuterie. Dans cette application, la fréquence est réglée sur 50 millisecondes (pour un fonctionnement plus fluide en mode animation).

2. 2 Tests d'applications

L'application développée a été testée sous Microsoft Windows 7 64 bits avec .NET Framework 4.5 installé. Le résultat du lancement du fichier exécutable Image_Rotation.exe est présenté dans la figure 2.1.

Figure 2.1 - Fenêtre de l'application au démarrage

Lorsque je lance l'application, l'image par défaut que j'ai sélectionnée est « câblée ». Vous pouvez le modifier en cliquant sur le bouton « Télécharger l'image ». Le résultat du choix de votre propre image est présenté dans la figure 2.2.

Figure 2.2 - Sélection de votre propre image pour la rotation

D'autres actions sont décrites dans l'image par défaut. Après avoir sélectionné l'angle de rotation dans le champ de texte correspondant dans le coin supérieur gauche du formulaire, cliquez sur le bouton « faire pivoter l'image ». (voir Figure 2.3).

Figure 2.3 - Résultat d'une rotation de l'image de 8 degrés

Les rectangles décrits sur la figure sont un outil auxiliaire, ils sont affichés pour votre propre commodité et montrent le centre de l'image.

L'application met en œuvre une « protection contre les erreurs », à savoir : si vous essayez de saisir un angle supérieur à 360 degrés, ou inférieur à -360 degrés, ainsi que du texte, un avertissement s'affiche et l'image ne sera pas traitée :

Figure 2.4 - Tentative de rotation de l'image de -361 degrés

L'application implémente la possibilité de « rotation animée » dans le sens horaire/antihoraire, ainsi que de « zoom » (agrandissement de l'image pour l'adapter au conteneur PictureBox).

Figure 2.5 - Rotation animée

CONCLUSION

La tâche fixée dans les spécifications techniques du test a été réalisée.

Étudier les techniques de traitement d'images à l'aide du langage de programmation C#.

Le code source de l’application est présenté en annexe A.

LISTE DES SOURCES UTILISÉES

1 Starovoitov V.V. Images numériques : de l'acquisition à

traitement / V.V. Starovoitov, Yu.I. Golub - Minsk : OIPI NAS de Biélorussie, 2014. - 202 p. - ISBN978-985-6744-80-1.

2 Christian Nagel, Bill Ivien et autres C# 2008 et la plateforme .NET 3.5 pour les professionnels - Professional C# 2008. - M. : Dialectique, 2008. - ISBN 978-5-8459-1458-3.

3 Développement d'applications sur la plateforme Microsoft. MSDN [Ressource électronique] : http://msdn.microsoft.com/ru-ru/library/4f9s3at1(v=vs.110).aspx. - Date d'accès : 25/10/2014.

ANNEXE A

Listing de la classe "frmRotationForm"

en utilisant System.Collections.Generic ;

en utilisant System.ComponentModel ;

en utilisant System.Data ;

en utilisant System.Drawing ;

en utilisant System.Linq ;

en utilisant System.Text ;

en utilisant System.Threading.Tasks ;

en utilisant System.Windows.Forms ;

en utilisant System.Drawing.Drawing2D ;

espace de noms Image_Rotation

classe partielle publique frmRotationForm : formulaire

private int jj;//angle en degrés

public frmRotationForm()

InitializeComponent();

w.Text = PictureBox3.Image.Width.ToString();

h.Text = PictureBox3.Image.Height.ToString();

jj = Convert.ToInt32(textBox1.Text);

private void btnRotateImage_Click (expéditeur de l'objet, EventArgs e)

ang = Convert.ToInt32(textBox1.Text);

si (ang< -360 || ang > 360)

attraper (Exception ex)

MessageBox.Show("Les angles de 0 à 360 sont autorisés. \nLe signe \"-\" peut tourner dans le sens inverse des aiguilles d'une montre.");

Bitmap i = nouveau Bitmap(pictureBox1.Image);

PictureBox1.Image = this.RotateImage(i, ang);

//this.Controls.Add(pictureBox1);

Bitmap RotateImage privé (image Bitmap, angle int)

var pi2 = Math.PI/2;//PI par deux

int oldWidth = Image.Width;

int oldHeight = Image.Hauteur ;

var theta = angle * Math.PI / 180.0; //convertir en radians

var verrouillé_theta = thêta ;

si (locked_theta< 0.0) locked_theta += 2 * Math.PI;

double newWidth, newHeigth ;

int nLargeur, nHauteur ;

double adjacentTop, opposéTop ;

double adjacentBottom, opposéBottom ;

#region Calculer la nouvelle largeur et la nouvelle hauteur

double SINUS = Math.Abs(Math.Sin(locked_theta));

double COSINUS = Math.Abs(Math.Cos(locked_theta));

si ((locked_theta >= 0.0 && verrouillé_theta< pi2) || (locked_theta >= Math.PI && verrouillé_theta< (Math.PI + pi2)))

(// Angle (>= 0 et< Pi/2) или (>= PI et< ПИ + Пи/2)

adjacentTop = COSINUS * oldWidth ;

en faceTop = SINUS * oldWidth ;

adjacentBottom = COSINUS * oldHeigth ;

opposéBottom = SINUS * oldHeigth ;

adjacentTop = SINUS * oldHeigth ;

opposéTop = COSINUS * oldHeigth ;

adjacentBottom = SINUS * oldWidth ;

en faceBottom = COSINUS * oldWidth ;

newWidth = adjacentTop + opposéBottom ;

newHeigth = adjacentBottom + opposéTop ;

nLargeur = (int)(Math.Ceiling(newWidth));//arrondir à des nombres entiers

nHeigth = (int)(Math.Ceiling(newHeigth));

#endregion Calculer la nouvelle largeur et la nouvelle hauteur

Bitmap rotatedBmp = new Bitmap(nWidth,nHeigth);

Graphiques g = Graphics.FromImage(rotatedBmp);

Point points = new Point ;//un tableau de structures de type 3 Point qui définissent un parallélogramme

//Trois points représentent : les coins supérieur gauche, supérieur droit et inférieur gauche du parallélogramme.

//Le quatrième point est extrapolé des trois premiers

//point de référence (0,0) - coin supérieur gauche

si (locked_theta >= 0.0 && verrouillé_theta< pi2) //90

points = nouveau Point((int)oppositeBottom, 0);

sinon si (locked_theta >= pi2 && verrouillé_theta< Math.PI) //90-180

points = nouveau Point(nLargeur, (int)(opposéTop));

sinon si (locked_theta >= Math.PI && verrouillé_theta< (Math.PI + pi2))//180-270

points = nouveau Point((int)(adjacentTop), nHeigth);

points = nouveau Point(0, (int)(adjacentBottom));

points = nouveau Point(nLargeur, (int)(opposéTop));

points = nouveau Point(0, (int)(adjacentBottom));

points = nouveau Point((int)(oppositeBottom), 0);

points = nouveau Point((int)(adjacentTop), nHeigth);

label6.Text = "Centre ORIGINAL x="+ (oldWidth / 2.0f).ToString() + ", y=" + (oldHeigth / 2.0f).ToString();

label7.Text = "Center ROTATE x=" + (nWidth / 2.0f).ToString() + ", y=" + (nHeigth / 2.0f).ToString();

g.DrawImage(Image, points);

g.DrawRectangle(nouveau stylo(Couleur.Rouge, 0.1f),nouveau Rectangle(0,0,nLargeur/2,nHauteur/2));

g.DrawRectangle(new Pen(Color.Red, 0.1f), new Rectangle(nWidth/2, nHeigth/2, nWidth/2-1, nHeigth/2-1));

Image.Dispose();

retourner rotatedBmp ;

private void btnLoadImage_Click (expéditeur de l'objet, EventArgs e)

OpenFileDialog dlg = new OpenFileDialog();

dlg.Title = "(!LANG : Ouvrir l'image";!}

dlg.Filter = "Fichiers jpg (*.jpg)|*.jpg|Tous les fichiers (*.*)|*.*";

si (dlg.ShowDialog() == DialogResult.OK)

PictureBox3.Image = new Bitmap(dlg.OpenFile());

imageBox1.Image = imageBox3.Image;

w.Text = PictureBox1.Image.Width.ToString();

h.Text = PictureBox1.Image.Height.ToString();

private void timer1_Tick (expéditeur de l'objet, EventArgs e)

si (checkBox2.Checked)

(//changer le mode pkcherbox en ZOOM

PictureBox1.SizeMode = PictureBoxSizeMode.Zoom;

//si décoché, l'image est centrée

pictureBox1.SizeMode = PictureBoxSizeMode.CenterImage;

si (checkBox1.Checked)

(//mise en place de « animation » - rotation de l'image autour de son axe dans le sens horaire/antihoraire

radioButton1.Visible = vrai ;

radioButton2.Visible = vrai ;

si (radioButton1.Checked)

( //dans le sens des aiguilles d'une montre

this.textBox1.Text = jj++.ToString();

si (jj == 360) jj = 0 ;

(//dans le sens inverse des aiguilles d'une montre

this.btnRotateImage_Click(this, e);

this.textBox1.Text = jj--.ToString();

si (jj == 0) jj = 359 ;

radioButton1.Visible = faux ;

radioButton2.Visible = faux ;

Documents similaires

    Filtrage du bruit d'image. Algorithmes pour sa binarisation et sa rotation. Formation de fonctionnalités informatives pour la reconnaissance de notes. Schéma du logiciel. Description des classes, fonctions, méthodes implémentées dans le programme. Tests d'applications.

    travail de cours, ajouté le 17/12/2013

    Informations sur les formats graphiques. Stockage d'une image dans le programme. File d'attente comme structure de données auxiliaire. Chargement d'une image à partir d'un fichier binaire. Opérations avec des images. Diminution de la résolution. Augmentez la taille de l'image.

    travail de cours, ajouté le 29/06/2013

    Développement d'un programme conçu pour compresser ou compresser une image en demi-teintes en utilisant la norme internationale JPEG. Description de la méthode JPEG, sortie des résultats sous forme d'image décodée. Examen des méthodes de compression d’images en demi-teintes.

    travail de cours, ajouté le 14/10/2012

    Algorithme général de comparaison de deux images. Méthode de surface maximale. Méthode d'histogramme. Préparer une image pour la reconnaissance. Modélisation d'une fonction multivariée. Répartition des vecteurs. Modèles déformables. Implémentation du logiciel.

    thèse, ajoutée le 29/09/2008

    Description des étapes de création d'une image GIF animée du personnage de dessin animé "Winnie l'ourson" dans Adobe Photoshop CS6. Création d'un calque d'image en double et préparation des images pour l'animation GIF. Personnalisez les effets d'animation et le fichier GIF du résultat.

    travaux de laboratoire, ajouté le 05/03/2015

    Développement d'une application dont le but est de convertir des images en demi-teintes noir et blanc en images couleur. Revue des techniques de traitement d'images, des méthodes de transformation d'images utilisant un réseau de neurones. Descriptions du regroupement d’espaces colorimétriques.

    thèse, ajoutée le 17/06/2012

    Détermination des paramètres de mouvement pendant le mouvement de rotation, dépendance de la vitesse, de l'accélération, du temps sur l'angle de rotation, réglage du temps de rotation à un certain angle. Application du modèle mathématique construit au calcul des paramètres de mouvement du corps.

    travail de cours, ajouté le 18/03/2010

    Infographie. Pixels, résolution, taille de l'image. Types d'images. Images de lignes et de demi-teintes en noir et blanc. Couleurs indexées. Images en couleur. Formats de fichiers. La couleur et ses modèles. Modèles de couleurs : RVB, CMJN, HSB.

    résumé, ajouté le 20/02/2009

    Méthodes de codage d'images : codage en longueur de plage, codage dépendant de la fréquence, méthode Lempel-Ziv. Taille de ligne en couleur 16 bits. Calculez la taille de l’intégralité de l’image originale. Exemples de compression d'images de haute et de basse qualité.

    présentation, ajouté le 22/10/2013

    Interface du programme Adobe Photoshop. Apporter des modifications à l'image. Outils pour changer la teinte et déformer les images. Séquence de formation d'images. Correction des tons et des couleurs des images, travail avec des filtres et des fonctions.

Faire pivoter une image raster selon des angles multiples de 90° par rapport au centre géométrique de l'image est une tâche triviale et peut être résolue sans perte de qualité en transformant simplement les coordonnées de chaque pixel.

Ci-dessous, nous examinerons un algorithme de rotation précise d'une image raster selon un angle arbitraire par rapport à un centre arbitraire avec des pertes minimales.

J'exprime ma gratitude à Vladislav Vladimirovitch Kharchenko pour l'aide apportée.

Algorithme

De la figure ci-dessus, on peut voir qu'après rotation de l'image raster, la couleur de chaque pixel de l'image finale est déterminée en ajoutant les couleurs de plusieurs « fragments » de plusieurs pixels de l'image originale, proportionnellement aux zones de l'image correspondante. des « fragments ». Par conséquent, en termes généraux, la solution à notre problème sera de trouver les aires de tous les « fragments » pour chaque pixel de l'image originale et de collecter la couleur de chaque pixel de l'image finale à partir des couleurs des « fragments » correspondants.

Comme modèle pixel de l'image originale, nous utiliserons un carré de côté = 1, avec les notations suivantes pour les coins :
i1 - coin le plus à droite ;
i2 - coin le plus bas ;
i3 - coin le plus à gauche ;
i4 est le coin le plus haut.

Le modèle d'image final sera une grille de lignes horizontales et verticales parallèles avec une distance entre les lignes = 1.

Les coordonnées du centre de rotation de l'image raster, dans cette représentation, peuvent être exprimées sous la forme d'une paire de nombres réels arbitraires. Autrement dit, le centre de rotation dans notre problème peut se situer non pas au centre géométrique du pixel ni au point d'intersection des lignes de la grille, mais en un point arbitraire des coordonnées cartésiennes.

Puisque lorsqu'une image raster est tournée, le carré de chaque pixel est tourné du même angle (par rapport au centre de ce pixel), nous allons résoudre le problème pour un pixel, puis appliquer la solution résultante à chaque pixel de l'original. image.

La rotation d'un bitmap peut être divisée en deux parties :
1. Faites pivoter le carré de chaque pixel de l'image originale par rapport au centre de ce carré d'un angle donné.
2. Déplacement du centre du carré du pixel en fonction de l'angle de rotation de l'image par rapport au centre de rotation de l'image pour que le carré prenne sa position finale sur la grille de l'image finale.
Dans ce cas, la grille de l'image finale découpe le carré de chaque pixel de l'image originale en « fragments » à raison de 4, 5 ou 6 morceaux.

Pour systématiser la variété des options résultantes, j'ai dû créer une taxonomie de toutes les intersections possibles du carré de pixels de l'image originale avec la grille de l'image finale. Il n’y avait que 23 options significativement différentes :



Les conventions ici sont les suivantes :
- les nombres dans les cellules indiquent les numéros des coins du carré de pixels tombés dans une cellule donnée de la grille d'image finale après rotation de l'image ;
- la couleur verte indique les cellules dans lesquelles des parties du pixel sont tombées et sont garanties d'y laisser un « éclat » ;
- le jaune indique les alvéoles dans lesquelles, selon les conditions, peut frapper (ou ne pas toucher) des « fragments » du carré de pixels, formés non pas par les coins du carré, mais par les côtés du carré.

Pour plus de clarté, je donnerai une des variantes possibles de l'option n°3 :

Comme vous pouvez le constater, la cellule supérieure droite ne contient pas de « fragment » de pixel, bien que cela puisse l'être dans d'autres conditions de rotation.
Afin de ne pas alourdir le lecteur avec des calculs géométriques détaillés, je dirai tout de suite que dans toutes ces 23 options, le pixel de l'image originale est découpé en « fragments », dont l'aire se calcule facilement en combinant 4 formules . Vous trouverez ci-dessous ces formules avec des illustrations. La couleur rouge indique les lignes de grille de l'image finale qui traversent le carré de pixels. La zone dont l'aire est calculée par la formule est ombrée en jaune.

Formule 1

Cette formule n'est pas utilisée pour calculer l'aire finale du « fragment », mais elle est pratique à utiliser pour calculer rapidement les zones intermédiaires auxiliaires, puisque l'on sait que l'aire du pixel entier = 1.
Les hauteurs déposées des coins du carré sur la grille de l'image finale sont utilisées comme variables d'entrée dans toutes les formules, pour la simple raison que le calcul de ces hauteurs revient à sélectionner instantanément la partie fractionnaire de la valeur numérique de la coordonnée. du coin correspondant du carré du pixel.

Formule 2


Cette formule est utilisée uniquement dans les options 1 et 2.

Formule 3

Une formule fréquemment utilisée - l'avantage est qu'elle est rapidement calculée. Étant donné que l'angle de rotation est le même pour chaque pixel, toutes les fonctions trigonométriques peuvent être calculées une fois, avant de traiter tous les pixels, puis utiliser ces valeurs dans la boucle comme constantes.

Formule 4

Cette formule est calculée en deux étapes. Tout d’abord, l’expression entre parenthèses est évaluée. Si la valeur est positive, la surface est calculée. Si la valeur est négative, cela signifie que « l’éclat » formé par le coin de la grille et le côté du carré n’est pas coupé du pixel et qu’il ne sert à rien d’effectuer d’autres calculs.

En tenant compte de tout ce qui précède, l'algorithme ressemblera en général à ceci :
1. Chargez l'image originale dans la mémoire de l'ordinateur.
2. Calculez les dimensions de l'image finale en pixels.
3. Créez un tableau bidimensionnel intermédiaire, dont chaque élément contient 3 composants de couleur RVB au format de nombres à virgule flottante. Les dimensions du tableau sont égales aux dimensions de l'image finale.
4. Parcourez séquentiellement tous les pixels de l’image source ; on fait pivoter chacun d'eux d'un angle donné et on les place sur la grille de l'image finale, en calculant les 4 coordonnées des coins du carré de pixel ; nous classons le pixel en 23 options et comptons les zones des « fragments » ; Nous ajoutons les couleurs des « fragments » résultants aux éléments correspondants du tableau intermédiaire proportionnellement à la surface de ces « fragments ».
5. Après avoir traité tous les pixels de l'image originale, nous arrondissons les valeurs RVB du tableau intermédiaire à une valeur entière pour chaque élément et créons l'image finale au format BMP sur la base de ces valeurs entières.

Programme

Sur la base de l'algorithme ci-dessus, un programme pour Windows a été écrit. Les codes sources d'Object Pascal et le fichier exécutable compilé peuvent être téléchargés.

Interface du programme.
Cliquer sur le bouton « Ouvrir » ouvre une boîte de dialogue de sélection de fichier BMP. Seuls les bitmaps avec une palette de 24 bits sont pris en charge. L'image ouverte est affichée dans une fenêtre. Le titre de la fenêtre affiche le chemin complet du fichier et les dimensions de l'image.

Dans le champ « Angle », spécifiez l'angle de rotation en degrés – n'importe quel nombre positif.
Un point ou une virgule peut être utilisé comme séparateur décimal lors de la saisie de nombres fractionnaires.

Les boutons radio « CW » et « CCW » règlent le sens de rotation : respectivement « dans le sens des aiguilles d'une montre » et « dans le sens inverse des aiguilles d'une montre ».

Dans le bloc « Couleur de fond », vous pouvez définir la couleur de fond avec laquelle les pixels de bordure de l'image seront mélangés. La couleur d'arrière-plan par défaut est le noir.

Dans les champs « Centre X » et « Centre Y », sont précisées les coordonnées du centre de rotation. Il faut tenir compte du fait que l'origine des coordonnées se trouve dans le coin supérieur gauche de l'image et Y augmente vers le bas. Par défaut, le centre de rotation est défini sur le centre géométrique de l'image chargée.

En cliquant sur le bouton « Rotation » ou en appuyant sur la touche Entrée, l'image est pivotée d'un angle spécifié par rapport au centre de rotation spécifié et affichée dans la fenêtre. La rotation de l'image selon des angles multiples de 90° est réalisée selon un schéma simplifié, en transformant simplement les coordonnées en pixels de l'image originale, tandis que les valeurs « Centre X » et « Centre Y » sont ignorées.
Le temps de fonctionnement de l'algorithme en secondes est affiché sous le bouton « Rotation ».

À l'aide du bouton « Enregistrer... », l'image pivotée peut être enregistrée dans un fichier BMP.

Si l'image finale ne rentre pas dans la fenêtre, elle est ajustée aux bordures de la fenêtre à l'aide de la fonction API StretchBlt. Par conséquent, la qualité réelle des grandes images ne peut être évaluée qu'à l'aide du fichier BMP enregistré.
Pour faire pivoter une image sous un angle différent, vous n'avez pas besoin de la recharger : c'est l'image du fichier sélectionné qui est pivotée, et non celle actuellement affichée dans la fenêtre.

Une image aux dimensions de 1024 x 768 sur une machine équipée d'un processeur quadricœur de 2,67 GHz est tournée par ce programme selon un angle arbitraire, en moyenne en environ 0,5 seconde. Une image aux dimensions de 4000 x 4000 - en 10 secondes environ. Le temps de fonctionnement de l'algorithme pour différents angles peut différer en raison du fait que l'image sous différents angles est divisée en un nombre différent de « fragments », le temps total passé à calculer les zones de ces fragments est en conséquence différent.

Le tableau intermédiaire contenant des informations sur la couleur des pixels de l'image finale au format à virgule flottante est implémenté sur le type étendu (10 octets), donc le traitement de grandes images (environ plus de 5 000 x 5 000 pixels) peut provoquer une erreur de dépassement de mémoire. Il est possible d'améliorer la situation en utilisant un type de données moins précis et en enregistrant la partie entière du nombre directement dans le bitmap final, en ne laissant que la partie fractionnaire dans le tableau auxiliaire.

Résultats

Faisons une analyse comparative du fonctionnement de l'algorithme de précision et de l'algorithme de rotation d'image implémenté dans Photoshop.

Essai 1

Pour le premier test, j'ai pris une image très simple - une ligne noire horizontale de 1 pixel d'épaisseur et 10 pixels de long, décalée par rapport au centre d'un carré blanc de dimensions 100 x 100 pixels :

Après quoi j'ai fait pivoter cette image par rapport au centre géométrique de 3° dans le sens des aiguilles d'une montre. Voici le résultat comparatif (zoomé 24x) :

Algorithme de précision

Photoshop CS6 (64 bits)
Évidemment, l'algorithme Photoshop introduit certaines distorsions dans l'image. Au passage, notons que l'algorithme de rotation implémenté dans Photoshop n'a pas subi d'évolution notable depuis 10 ans.

Essai 2

Pour le deuxième test, j'ai choisi Tulip de la distribution standard Win7 :

Après avoir fait pivoter cette image de 5° dans le sens des aiguilles d'une montre par rapport au centre géométrique, j'ai additionné la couleur de tous les pixels en termes de canaux RVB. Voici le résultat pour l'algorithme de précision et l'algorithme Photoshop :

Les chiffres entre parenthèses indiquent l'écart absolu de cet indicateur par rapport à l'original.
La couleur de l'image après une rotation de précision et avant l'arrondi n'a pratiquement pas changé - ce qui était prévisible.
Le plus grand écart, dans ce cas particulier, se trouve dans le canal G de l'algorithme Photoshop. En pourcentage, cet écart n’est que de 0,06 %, il n’est donc pas perceptible « à l’œil nu », mais pour des raisons de perfectionnisme, le résultat de Photoshop est pire que celui d’un algorithme de précision.
Il est important de noter qu'arrondir la couleur de chaque pixel dans l'algorithme de précision à la valeur entière requise par le format BMP détruit de manière irréversible une partie des informations de couleur.

Pour une comparaison visuelle des deux algorithmes, je vais donner un fragment agrandi de l'image,

tourné respectivement de 5° dans le sens des aiguilles d'une montre, Photoshop :

et un algorithme de précision :

L'analyse comparative montre que Photoshop parvient mieux à préserver les éléments contrastés de l'image, tout en créant des « halos » de couleurs déformées. L'algorithme de précision ne déforme pas la couleur, mais en même temps « brouille » quelque peu l'image.

Conclusions

1. Une rotation précise et en même temps relativement rapide d'une image raster selon un angle arbitraire est possible. Cela reste un mystère pour moi pourquoi les éditeurs graphiques professionnels ne disposent pas d'une option permettant à l'utilisateur de faire pivoter une image avec une extrême précision en un peu plus de temps.

2. Malgré l'extrême précision de l'algorithme considéré, la transformation d'image inverse, c'est-à-dire La rotation vers l'angle opposé sans perte de qualité est impossible car l'arrondi de la valeur de couleur exacte (au format virgule flottante) détruit de manière irréversible certaines informations de couleur.

3. Du point de vue de la perception visuelle des détails contrastés, le meilleur résultat est obtenu par l'algorithme sous-optimal. Il est logique d'utiliser un algorithme de précision dans les cas où il est important de conserver un maximum d'informations sur la couleur de l'image.



Avez-vous aimé l'article? Partagez avec vos amis !