
Lorsque le fichier image est lu avec la fonction OpenCV imread(), l’ordre des couleurs est BGR (bleu, vert, rouge). En revanche, dans Pillow, l’ordre des couleurs est supposé être RVB (rouge, vert, bleu).
Par conséquent, si vous souhaitez utiliser à la fois la fonction Pillow et la fonction OpenCV, vous devez convertir BGR et RGB.
Vous pouvez utiliser la fonction OpenCV cvtColor() ou simplement changer l’ordre de ndarray.
Cet article décrit le contenu suivant.
- OpenCV est BGR, Pillow est RVB
- Convertir BGR et RVB avec la fonction OpenCV cvtColor()
- Convertir BGR et RVB sans utiliser cvtColor()
OpenCV est BGR, Pillow est RVB
Lors de la lecture d’un fichier image couleur, OpenCV imread() se lit comme un tableau NumPy ndarray de ligne (hauteur) x colonne (largeur) x couleur (3). L’ordre de couleur est BGR (bleu, vert, rouge).
La fonction OpenCV imwrite() qui enregistre une image suppose que l’ordre des couleurs est BGR, elle est donc enregistrée en tant qu’image correcte.
import cv2
import numpy as np
from PIL import Image
im_cv = cv2.imread('data/src/lena.jpg')
cv2.imwrite('data/dst/lena_bgr_cv.jpg', im_cv)

Lorsque vous effectuez un traitement d’image avec Pillow, vous pouvez convertir ndarray en un objet PIL.Image avec Image.fromarray(), mais dans Pillow, l’ordre des couleurs suppose RVB (rouge, vert, bleu).
Par conséquent, si le ndarray de l’image lue par OpenCV imread() est converti en un objet PIL.Image et enregistré, l’image avec la mauvaise couleur est enregistrée.
pil_img = Image.fromarray(im_cv)
pil_img.save('data/dst/lena_bgr_pillow.jpg')

Si vous souhaitez convertir des objets ndarray et PIL.Image pour utiliser à la fois les fonctions Pillow et OpenCV, vous devez convertir BGR et RGB.
Convertir BGR et RVB avec la fonction OpenCV cvtColor()
Divers espaces colorimétriques tels que RVB, BGR, HSV peuvent être mutuellement convertis à l’aide de la fonction OpenCV cvtColor().
dst = cv2.cvtColor(src, code)
Se référer au document suivant pour la valeur à spécifier pour le code paramètre.
Lorsque le code est cv2.COLOR_BGR2RGB, BGR est converti en RVB.
Lorsqu’elle est convertie en RVB, elle sera enregistrée en tant qu’image correcte même si elle est enregistrée après avoir été convertie en objet PIL.Image.
im_rgb = cv2.cvtColor(im_cv, cv2.COLOR_BGR2RGB)
Image.fromarray(im_rgb).save('data/dst/lena_rgb_pillow.jpg')

Une fois converti en RVB et enregistré avec OpenCV imwrite(), ce sera une image couleur incorrecte.
cv2.imwrite('data/dst/lena_rgb_cv.jpg', im_rgb)

Le code du paramètre lors de la conversion de RVB en BGR est cv2.COLOR_RGB2BGR. Utilisez ceci lors de la lecture d’un fichier image en tant que PIL.Image, convertissez-le en ndarray et enregistrez-le à l’aide d’OpenCV imwrite().
im_pillow = np.array(Image.open('data/src/lena.jpg'))
im_bgr = cv2.cvtColor(im_pillow, cv2.COLOR_RGB2BGR)
cv2.imwrite('data/dst/lena_bgr_cv_2.jpg', im_bgr)
Convertir BGR et RVB sans utiliser cvtColor()
La conversion de BGR et RVB peut être réalisée sans utiliser cvtColor().
Il existe plusieurs façons, par exemple, comme suit:
im_bgr = cv2.imread('data/src/lena.jpg')
im_rgb = im_bgr[:, :, [2, 1, 0]]
Image.fromarray(im_rgb).save('data/dst/lena_swap.jpg')
im_rgb = im_bgr[:, :, ::-1]
Image.fromarray(im_rgb).save('data/dst/lena_swap_2.jpg')
