
Le module Image de la bibliothèque de traitement d’image Pillow (PIL) de Python fournit composite() pour composer deux images selon une image masque.
Cet article décrit le contenu suivant.
- Paramètres de Image.composite()
- Exemple de code de Image.composite()
- Composez toute la zone à un rapport constant
- Créer une image de masque en dessinant
- Utiliser l’image existante comme image de masque
Veuillez vous référer à l’article suivant pour l’installation et l’utilisation de base de Pillow (PIL).
Notez que composite() est une fonction permettant de composer deux images de même taille. Utilisez paste() pour composer des images de différentes tailles. paste() vous permet de masquer une petite image et de la coller n’importe où sur la grande image.
La composition d’image est possible avec OpenCV et NumPy au lieu de Pillow. Voir l’article ci-dessous.
Paramètres de Image.composite()
Il y a trois paramètres pour composite(). Tous les trois doivent être des objets Image, tous de la même taille.
image1, image2
Deux images à composer.
masque
Image de masque.
mode doit être l’un des trois types suivants.
- 1 : image 1 bit (image binaire)
- L : image en niveaux de gris 8 bits
- RGBA : Image avec canal alpha
l’image1 et l’image2 sont fusionnées en alpha en fonction de la valeur du masque.
# For 1bit
result = mask * image1 + (1 - mask) * image2
# For 8bit
result = mask / 255 * image1 + (1 - mask / 255 ) * image2
Exemple de code de Image.composite()
Importer une image à partir de PIL et charger des images.
ImageDraw et ImageFilter sont utilisés lors du dessin d’une figure et de la création d’une image de masque. Lors de la lecture d’un fichier image et de son utilisation comme image de masque, ils peuvent être omis.
from PIL import Image, ImageDraw, ImageFilter
im1 = Image.open('data/src/lena.jpg')
im2 = Image.open('data/src/rocket.jpg').resize(im1.size)


Cette fois, la deuxième image est réduite par resize() pour correspondre à la taille. Si vous découpez une partie de l’image et ajustez la taille, utilisez crop(). Voir l’article suivant.
Composez toute la zone à un rapport constant
Lorsqu’une image solide est utilisée comme image de masque, l’image entière est composée selon un rapport constant.
Par exemple, créez une image solide avec une valeur de 128 avec Image.new() et utilisez-la comme image de masque.
mask = Image.new("L", im1.size, 128)
im = Image.composite(im1, im2, mask)
# im = Image.blend(im1, im2, 0.5)

La méthode blend () peut également composer toute la surface avec un rapport constant. Spécifiez une constante de 0,0 à 1,0 comme paramètre alpha au lieu de masque.
Créer une image de masque en dessinant
Si vous souhaitez masquer et composer avec une forme simple, telle qu’un cercle et un rectangle, le dessin avec le module ImageDraw est pratique. Pour plus de détails sur le dessin, consultez l’article suivant. Vous pouvez également dessiner des polygones.
Dessinez un cercle blanc sur un fond noir pour créer une image de masque.
mask = Image.new("L", im1.size, 0)
draw = ImageDraw.Draw(mask)
draw.ellipse((140, 50, 260, 170), fill=255)
im = Image.composite(im1, im2, mask)


Les limites peuvent être composées en douceur en brouillant l’image du masque avec ImageFilter.
mask_blur = mask.filter(ImageFilter.GaussianBlur(10))
im = Image.composite(im1, im2, mask_blur)


Utiliser l’image existante comme image de masque
Une image existante peut être lue et utilisée comme image de masque pour composer une forme complexe.
Essayez d’utiliser une image en forme de cheval en noir et blanc (exemple d’image scikit : skimage.data.horse() ).

Une fois l’image lue par open(), elle est ajustée à la taille de l’image collée par resize(), et le mode est converti en ‘L’ (niveaux de gris) par convert().
mask = Image.open('data/src/horse.png').convert('L').resize(im1.size)
im = Image.composite(im1, im2, mask)

Si vous souhaitez inverser le noir et blanc de l’image du masque, veuillez vous référer à l’article suivant.
Un autre exemple:
Il est composé pour changer progressivement avec l’image de gradation générée à l’aide de NumPy.
mask = Image.open('data/src/gradation_h.jpg').convert('L').resize(im1.size)
im = Image.composite(im1, im2, mask)


