- 1. Transformations d'image - Transformation affine et non-affine
- 2. Traductions d'images - Déplacement de l'image vers le haut, le bas, la gauche et la droite
- 3. Rotation de l'image - Rotation de l'image
- 4. Mise à l'échelle, redimensionnement et interpolation
- 5. Pyramides d'images - Une autre façon de redimensionner
- 6. Recadrage - Découpe de la zone d'image souhaitée
- 7. Opérations arithmétiques pour éclaircir et assombrir les images
Dans le didacticiel précédent, nous avons découvert OpenCV et effectué un traitement d'image de base en l'utilisant comme la mise à l'échelle des gris, la saturation des couleurs, l'histogramme, les espaces colorimétriques, le composant RVB etc. Comme indiqué dans le didacticiel précédent, OpenCV est une bibliothèque Open Source Commuter Vision qui a Interfaces C ++, Python et Java et prend en charge Windows, Linux, Mac OS, iOS et Android. Il peut donc être facilement installé dans Raspberry Pi avec l'environnement Python et Linux. Et Raspberry Pi avec OpenCV et caméra connectée peut être utilisé pour créer de nombreuses applications de traitement d'image en temps réel telles que la détection de visage, le verrouillage du visage, le suivi d'objet, la détection de plaque d'immatriculation de voiture, le système de sécurité domestique, etc.
Dans ce tutoriel, nous allons voir comment nous allons manipuler l'image en utilisant OpenCV. Ici, nous allons apprendre à appliquer la fonction suivante sur une image en utilisant OpenCV:
- Transformations d'image - Transformation affine et non affine
- Traductions d'images - Image en mouvement vers le haut, le bas, la gauche et la droite
- Rotation de l'image - Rotation de l'image
- Mise à l'échelle, redimensionnement et interpolation
- Pyramides d'images - Une autre façon de redimensionner
- Recadrage - Découpe de la zone d'image souhaitée
- Opérations arithmétiques pour éclaircir et assombrir les images
1. Transformations d'image - Transformation affine et non-affine
Les transformations sont des distorsions géométriques agissant sur une image, les distorsions ne signifient certainement pas ici des erreurs mais un type de correction pour corriger les problèmes de perspective découlant du point où l'image a été capturée. Il existe deux types de transformations d'image : affine et non affine
Les transformations affines sont de trois types: mise à l'échelle, rotation et translation, l'important dans les transformations affines est que les lignes sont parallèles avant et après les transformations d'image.
Les transformations non affines ou projectives ne préservent pas le parallélisme, la longueur ou l'angle, mais préservent la colinéarité et l'incidence, la colinéarité signifie que les deux points se trouvent sur la même ligne droite.
Les transformations non affines sont très courantes en vision par ordinateur et sont générées à partir de différents angles de caméra. Les transformations non affines ou projectives sont également appelées homographie.
2. Traductions d'images - Déplacement de l'image vers le haut, le bas, la gauche et la droite
La traduction d'image déplace l'image vers le haut, le bas, la gauche et la droite et même en diagonale si nous implémentons la traduction x et y en même temps.
Maintenant, pour effectuer des traductions d'images, nous utilisons la fonction warpAffine d'opencv, cv2.warpAffine est utilisé pour implémenter ces traductions mais pour cela nous avons besoin d'une matrice de traduction.
Matrice de traduction, T = 1 0 Tx
0 1 ty
T X, T y sont les directions dans lesquelles les décalages d'image ont lieu.
Où le T X est décalé le long de l'axe X (horizontal)
T Y est le décalage le long de l'axe Y (vertical)
# c'est une transformation affine qui change simplement la position d'une image # nous utilisons cv2.warpAffine pour implémenter ces transformations. import cv2 import numpy as np image = cv2.imread ('input.jpg') # stocker la hauteur et la largeur de l'image hauteur, width = image.shape print (image.shape) quater_height, quater_width = height / 4, width / 4 T = np.float32 (,]) img_translation = cv2.warpAffine (image, T, (largeur, hauteur)) print (T) cv2.imshow ('image_original', image) cv2.waitKey (0) cv2.imshow (' Traduction ', img_translation) cv2.waitKey (0) cv2.destroyAllWindows ()
Sortie console - (183, 275) - hauteur et largeur
- matrice T
]
3. Rotation de l'image - Rotation de l'image
La rotation de l'image fait pivoter une image autour d'un point ou d'un point au centre de l'image, tout comme le point de rotation agit comme un pivot.
Comme en translation nous avons la matrice T, probablement en rotation nous avons la matrice M
Matrice de rotation, matrice M = Cosθ -Sinθ
Sinθ Cosθ
Où le θ est l'angle de rotation, mesuré dans le sens anti-horaire.
Il y a aussi une chose à noter qu'OpenCV vous permet de vendre et de faire pivoter l'image en même temps en utilisant la fonction, cv2.getRotationMatrix2D (rotation_center_x, rotation_center_y, angle de rotation, échelle)
Nous utilisons toujours la fonction warpAffine d'opencv pour obtenir la rotation de l'image, mais au lieu de la matrice de translation comme dans le cas précédent, nous utilisons ici la matrice de rotation.
import cv2 import numpy as np image = cv2.imread ('input.jpg') height, width = image.shape # divisez la hauteur et la largeur par 2 pour faire pivoter l'image autour de son centre rotation_matrix = cv2.getRotationMatrix2D ((width / 2, height / 2), 90,1) rotated_image = cv2.warpAffine (image, rotation_matrix, (width, height)) cv2.imshow ('image originale', image) cv2.waitKey (0) cv2.imshow ('image pivotée ', rotation_image) cv2.waitKey (0) cv2.destroyAllWindows ()
Maintenant, l'image pivote de 90 degrés, elle est recadrée en raison de la taille de la toile, car la taille de la toile reste la même mais en raison de la rotation, la taille de l'image ne correspond pas à la taille de la toile. Il peut être ajusté en définissant le facteur de mise à l'échelle sur négatif, mais cela permet un fond noir derrière l'image.
Ainsi, vous pouvez définir la hauteur et la largeur de l'image en l'anticipant ou en la devinant ou il existe une autre méthode de rotation de l'image en la transposant, mais elle ferait pivoter l'image par multiples de 90 degrés dans le sens anti-horaire.
4. Mise à l'échelle, redimensionnement et interpolation
La mise à l'échelle et le redimensionnement sont des transformations affines, le redimensionnement de l'image est ce que nous avons fait un certain temps et nous avons également traité de l'interpolation, comme lorsque vous redimensionnez l'image à une taille plus grande dans laquelle nous étendons les pixels, il y a des lacunes dans le pixels et c'est là que l'interpolation entre en jeu.
Cela peut se produire en augmentant la taille de l'image de plus petite à plus grande ou en diminuant la taille de l'image de plus en plus petite.
Techniquement, l' interpolation est une méthode de construction de nouveaux points de données (pixels), dans un ensemble discret de points de données connus.
Il existe différents types de méthodes d'interpolation dans OpenCV comme
cv2.INTER_AREA - bon pour réduire ou réduire l'échantillonnage
cv2.INTER_NEAREST - le plus rapide
cv2.LINEAR - bon pour zoomer ou échantillonner vers le haut (par défaut)
cv2.CUBIC - mieux
cv2.INTER_LANCZOS4 - meilleur
# le redimensionnement est très simple en utilisant la fonction cv2.resize, ses arguments sont # cv2.resize (image, dsize (taille de l'image de sortie), x_scale, y_scale, interpolation) import cv2 import numpy as np image = cv2.imread ('input. jpg ') cv2.imshow (' Original_image ', image) cv2.waitKey (0) # rendons l'image aux 3/4 de la taille de l'image d'origine, c'est-à-dire redimensionnée à 75% image_scaled = cv2.resize (image, None, fx = 0.75, fy = 0.75) # puisque l'interpolation linéaire est la méthode par défaut pour les cv ouverts, nous n'avons pas besoin de l'implémenter en tant que fonction. cv2.imshow ('scaling_linear interpolation', image_scaled) cv2.waitKey (0) # doublons la taille de notre image img_double = cv2.resize (image, None, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) # faisons le redimensionnement par dimensions exactes image_resize = cv2.resize (image, (200,300), interpolation = cv2.INTER_AREA) cv2.imshow ('scaling_exact', image_resize) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Pyramides d'images - Une autre façon de redimensionner
L'image pyramidale fait référence à la mise à l'échelle (agrandissement des images) ou à la réduction (réduction des images).
Il s'agit simplement d'une manière différente de redimensionner qui nous permet de redimensionner facilement et rapidement les images, en réduisant de moitié la hauteur et la largeur de la nouvelle image.
Cela s'avère utile lors de la création de détecteurs d'objets qui mettent à l'échelle les images chaque fois qu'il recherche un objet.
import cv2 image = cv2.imread ('input.jpg') plus petit = cv2.pyrDown (image) plus grand = cv2.pyrUp (plus petit) cv2.imshow ('original', image) cv2.waitKey (0) cv2.imshow ('plus petit', plus petit) cv2.waitKey (0) cv2.imshow ('plus grand', plus grand) cv2.waitKey (0) cv2.destroyAllWindows ()
Dans une image plus grande, vous remarquerez qu'être toujours de la même taille que l'image d'origine est peu floue car elle est convertie directement d'une image plus petite à une image plus grande. Mais si on l'interpole, la qualité de l'image s'améliore par rapport à la précédente car l'interpolation estime les pixels en remplissant les espaces lorsque l'image est agrandie.
Maintenant, exécuter le même code mais avec une interpolation cubique donne une meilleure qualité de grande image. Les images ci-dessous montrent la comparaison entre l'image originale, la version agrandie de l'image, l'image plus petite et la version interpolée cubique d'une image plus petite.
import cv2 image = cv2.imread ('input.jpg') plus petit = cv2.pyrDown (image) plus grand = cv2.pyrUp (plus petit) cv2.imshow ('original', image) cv2.waitKey (0) cv2.imshow ('plus petit', plus petit) cv2.waitKey (0) cv2.imshow ('plus grand', plus grand) cv2.waitKey (0) # augmentant la qualité de l'image plus grande convertie à partir d'une image plus petite en utilisant une interpolation cubique img_double = cv2.resize (plus petit, Aucun, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) cv2.destroyAllWindows ()
REMARQUE: Si vous souhaitez créer plusieurs petites copies d'images de plus en plus petites en taille ou plusieurs grandes copies d'images en croissance continue de taille, nous pouvons utiliser pour des boucles ou desboucles tout en conservant lafonction pyrDown ou pyrUp .
6. Recadrage - Découpe de la zone d'image souhaitée
Le recadrage d'images fait référence à l'extraction d'un segment d'image.
OpenCV directement n'a pas de fonction de recadrage mais cela peut être facilement fait par numpy en utilisant le code ci-dessous
Cropped = image
Nous mettons le tableau d'image et en utilisant des outils ou une méthode d'indexation dans numpy, nous définissons la ligne de début à la ligne de fin et la colonne de début à la colonne de fin séparés par une virgule qui extrait le rectangle que nous voulons recadrer pour obtenir l'image.
import cv2 import numpy as np image = cv2.imread ('input.jpg') height, width = image.shape # obtenons les coordonnées du pixel de départ (en haut à gauche du rectangle de recadrage) start_row, start_col = int (height *.25), int (width *.25) # obtenons les coordonnées de pixel de fin (en bas à droite) end_row, end_col = int (height *.75), int (width *.75) # utilisez simplement l'indexation pour rogner le rectangle que nous souhaitons rogné = image cv2.imshow ("image originale", image) cv2.waitKey (0) cv2.imshow ("image recadrée", recadrée) cv2.waitKey (0) cv2.destroyAllWindows ()
Notez que vous pouvez utiliser des valeurs de pixel directement au lieu de start_col ou start_row , elles sont juste données pour obtenir une identification facile pour l'utilisateur.
7. Opérations arithmétiques pour éclaircir et assombrir les images
Les opérations arithmétiques d'OpenCV consistent essentiellement à ajouter ou à soustraire des matrices à l'image, l'ajout ou la soustraction de matrices a un effet sur l'augmentation ou la diminution de la luminosité.
Donc, pour ajouter ou soustraire des matrices, nous devons les créer et numpy a une fonction appelée np.ones qui donne des matrices de la même taille que celle de notre image.
import cv2 import numpy as np image = cv2.imread ('input.jpg') #create une matrice de l'un, puis multipliez-la par un scaler de 100 ' # np.ones donne une matrice de même dimension que notre image avec tous les valeurs étant 100 dans ce cas M = np.ones (image.shape, dtype = "uint8") * 100 # nous utilisons ceci pour ajouter cette matrice M à notre image #notice l'augmentation de luminosité ajoutée = cv2.add (image, M) cv2.imshow ("Ajouté", ajouté) cv2.waitKey (0) # de même nous pouvons aussi soustraire #notice la diminution de la luminosité soustraite = cv2.subtract (image, M) cv2.imshow ("soustrait", soustrait) cv2.waitKey (0) cv2.destroyAllWindows ()
C'est ainsi qu'OpenCV peut être utilisé pour appliquer de nombreuses opérations de traitement d'image différentes sur l'image. Nous continuerons avec d'autres fonctions de manipulation d'images dans le prochain tutoriel.