Une cool introduction au fonctions usuelles OpenCV resize | rotate | crop

fonctions-base-OpenCV

En dehors des opérations basique pure tels qu'on les connaite le redimensionnement, la rotation et le découpage d'image ont de nombreuse applications. 

C'est tu par exemple que ces dernière sont très utilisé pour le Deep Learning ? 

La raison à cela est simple, les réseau de neurones convolutif qui sont largement employé en deep learning ont une entrée de taille unique. Une des conséquence à cela est que tout les images qu'on peut soumettre à ces derniers doivent avoir une taille unique et donc en conséquence être redimensionnées. 

Une autre exemple d'application de ce type d'opération et l'augmentation de données en vision par ordinateur, une technique qui permet d'améliorer les résultat des algorithme de reconnaissance faciale et de reconnaissance d'objet en générale et qui consiste simplement à redimensionner, à appliquer des rotation sur, à faire translater, les images de la base avec laquelle le réseau convolutif sera entrainer. 

Imagine par exemple que pour éviter que le réseau surapprenne, on veuille 4 fois plus d'image que ce dont l'on est en possession à l'heure actuelle. Il suffit juste d'appliquer 4 rotation (45 °, 90°, 135 ° 180 ° par exemple) aux images de la base pour obtenir une base quatre fois plus grandes. 

Sachant que si tu a lu mon article sur ma comparaison entre le Deep learning et le machine learning tu sais que les réseau de neurones convolutif requiert nettement plus d'image qu'un algorithme classique de machine learning. Quand aux GAN (Generative adversarial network) qui sont encore plus data-vore en données que les CNN, n'en parlons même pas de à qu'elle point ces petites opérations de redimensionment, rotation etc ... peuvent être utile.





Quoi qu'il en soit dans cette article, je vais aborder avec toi les points suivants: 

    Comment redimensionner une image

    Comment appliquer une rotation à une image 

    Comment découper une image

    Comment coller une image dans une autre


Comment redimensionner une image

Comme avec opencv-python une image est de type numpy array, il est possible d'obtenir ses dimension actuelle en utilisant l'attribut shape. 

image.shape

Plus spécifiquement pour redimenssioner une image avec OpenCV il faudra faire appel à la fonction resize comme suit :

img=cv2.resize(img,dim, interpolation = cv2.INTER_AREA)

elle prend en paramètre l'image, les dimension de la nouvelle image, la fonction d'interpolation qui sera utilisé pour redimensioner l'image.  Il existe de nombreuse fonction d'interpolations (cv2.INTER_NEAREST, cv2.INTER_LINEAR, etc....) mais globalement cv2.INTER_AREA fera l'affaire la majorité du temps.

import cv2
img=cv2.imread("geometry-1044090_1280.jpg")
ratio = 20
largeur = int(img.shape[1] * ratio / 100)
hauteur = int(img.shape[0] * ratio / 100)
dimension = (largeur, hauteur)
nouvelle_image=cv2.resize(img,dimension, interpolation = cv2.INTER_AREA)
print ("Dimension nouvelle image : ", nouvelle_image.shape)
cv2.imshow('image',nouvelle_image)
cv2.waitKey(0)
cv2.destroyAllWindows()


Resultat:

Redimensionner une image sans préserver l'aspect ratio

Quand vous redimensionner une image.


import cv2
img=cv2.imread("geometry-1044090_1280.jpg")
print ("Dimension image : ", img.shape)
largeur = img.shape[0] 
hauteur = 70
dimension = (largeur, hauteur)
nouvelle_image=cv2.resize(img,dimension, interpolation = cv2.INTER_AREA)
print ("Dimension nouvelle image : ", nouvelle_image.shape)
cv2.imshow('image',nouvelle_image)
cv2.waitKey(0)
cv2.destroyAllWindows()





Redimensionner une image en préservant l'aspect ratio



import cv2
img=cv2.imread("geometry-1044090_1280.jpg")
print ("Dimension image : ", img.shape)
hauteur = 100
ratio= hauteur/img.shape[0] 
largeur = int(img.shape[1]*ratio)
dimension = (largeur, hauteur)
nouvelle_image=cv2.resize(img,dimension, interpolation = cv2.INTER_AREA)
print ("Dimension nouvelle image : ", nouvelle_image.shape)
cv2.imshow('image',nouvelle_image)
cv2.waitKey(0)
cv2.destroyAllWindows()




Comment appliquer une rotation à une image


import cv2
img=cv2.imread("geometry-1044090_1280.jpg")
hauteur = img.shape[0] 
largeur = img.shape[1]
angle=20
centre = (largeur / 2, hauteur / 2)
= cv2.getRotationMatrix2D(centre, angle, 1.0)
nouvelle_image=cv2.warpAffine(img, M, (largeur,hauteur))
cv2.imshow('image',nouvelle_image)
cv2.waitKey(0)
cv2.destroyAllWindows()










import cv2
img=cv2.imread("geometry-1044090_1280.jpg")
hauteur = img.shape[0] 
largeur = img.shape[1]
angle=20
centre = (largeur / 2, hauteur / 2)
= cv2.getRotationMatrix2D(centre, angle, 1.0)
abs_cos = abs(M[0,0]) 
abs_sin = abs(M[0,1])
nouvelle_longueur= int(hauteur * abs_sin + largeur * abs_cos)
nouvelle_largeur = int(hauteur * abs_cos + largeur * abs_sin)
[0, 2] += nouvelle_longueur/2 - centre[0]
[1, 2] += nouvelle_largeur/2 - centre[1]
nouvelle_image=cv2.warpAffine(img, M, (nouvelle_longueur,nouvelle_largeur))
cv2.imshow('image',nouvelle_image)
cv2.waitKey(0)
cv2.destroyAllWindows()







Comment découper une image 



import cv2
img=cv2.imread("geometry-1044090_1280.jpg")
nouvelle_image=img[50:250,50:250]
cv2.imshow('image',nouvelle_image)
cv2.waitKey(0)
cv2.destroyAllWindows()







Comment insérer une image dans une autre


Source :


https://stackoverflow.com/questions/43892506/opencv-python-rotate-image-without-cropping-sides


 

 

.