
Quando il file immagine viene letto con la funzione OpenCV imread(), l’ordine dei colori è BGR (blu, verde, rosso). D’altra parte, in Pillow, si presume che l’ordine dei colori sia RGB (rosso, verde, blu).
Pertanto, se si desidera utilizzare sia la funzione Pillow che la funzione OpenCV, è necessario richiedere BGR e RGB.
Puoi usare la funzione OpenCV cvtColor() o semplicemente cambiare l’ordine di ndarray.
In questo articolo vengono descritti i seguenti contenuti.
- OpenCV è BGR, Cuscino è RGB
- Converti BGR e RGB con la funzione OpenCV cvtColor()
- Converti BGR e RGB senza usare cvtColor()
OpenCV è BGR, Cuscino è RGB
Durante la lettura di un file immagine a colori, OpenCV imread() legge come un array NumPy narray di riga (altezza) x colonna (larghezza) x colore (3). L’ordine dei colori è BGR (blu, verde, rosso).
La funzione OpenCV imwrite() che salva un’immagine presuppone che l’ordine dei colori sia BGR, quindi viene salvata come un’immagine corretta.
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)
Quando si esegue l’elaborazione delle immagini con Pillow, è possibile ottenere ndarray in un oggetto PIL.Image con Image.fromarray(), ma in Pillow l’ordine dei colori assume RGB (rosso, verde, blu).
Pertanto, se il ndarray dell’immagine letta da OpenCV imread() viene convertito in un oggetto PIL.Image e salvato, l’immagine con il colore sbagliato viene salvata.
pil_img = Image.fromarray(im_cv)
pil_img.save('data/dst/lena_bgr_pillow.jpg')
Se vuoi utilizzare oggetti ndarray e PIL.Image per utilizzare entrambe le funzioni Pillow e OpenCV, devi BGR e RGB.
Converti BGR e RGB con la funzione OpenCV cvtColor()
Vari spazi colore come RGB, BGR, HSV possono essere convertiti reciprocamente utilizzando la funzione OpenCV cvtColor().
dst = cv2.cvtColor(src, code)
Fare riferimento al seguente documento per il valore da specificare per il codice parametro.
Quando il codice è cv2.COLOR_BGR2RGB, BGR viene convertito in RGB.
Quando viene convertito in RGB, verrà salvato come un’immagine corretta anche se viene salvato dopo essere stato convertito in un oggetto PIL.Image.
im_rgb = cv2.cvtColor(im_cv, cv2.COLOR_BGR2RGB)
Image.fromarray(im_rgb).save('data/dst/lena_rgb_pillow.jpg')
Quando viene convertito in RGB e salvato con OpenCV imwrite(), sarà un’immagine a colori non corretta.
cv2.imwrite('data/dst/lena_rgb_cv.jpg', im_rgb)
Il codice del parametro durante la conversione da RGB a BGR è cv2.COLOR_RGB2BGR. Usalo quando leggi un file immagine come PIL.Image, convertilo in ndarray e salvalo usando 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)
Converti BGR e RGB senza usare cvtColor()
La conversione di BGR e RGB può essere realizzata senza utilizzare cvtColor().
Ci sono diversi modi, ad esempio, come segue:
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')