Skip to content

Konvertieren von BGR und RGB mit Python, OpenCV (cvtColor)

Python

Wenn die Bilddatei mit der OpenCV-Funktion imread() gelesen wird, ist die Reihenfolge der Farben BGR (blau, grün, rot). Wird in Pillow angenommen, dass die Reihenfolge der Farben RGB (Rot, Grün, Blau) ist.

Wenn SIE also sowohl die Pillow-Funktion als auch die OpenCV-Funktion verwenden möchten, müssen Sie BGR und RGB konvertieren.

Sie können die OpenCV-Funktion cvtColor() verwenden oder einfach die Reihenfolge von ndarray ändern.

Dieser Artikel hat folgenden Inhalt.

  • OpenCV ist BGR, Pillow ist RGB
  • Konvertieren Sie BGR und RGB mit der OpenCV-Funktion cvtColor()
  • BGR und RGB konvertieren, ohne cvtColor() zu verwenden

OpenCV ist BGR, Pillow ist RGB

Beim Lesen einer Farbbilddatei liest OpenCV imread() als NumPy-Array ndarray von Zeile (Höhe) x Spalte (Breite) x Farbe (3). Die Farbreihenfolge ist BGR (blau, grün, rot).

Die OpenCV-Funktion imwrite(), die ein Bild speichert, geht davon aus, dass die Reihenfolge der Farben BGR ist, also WIRD es als korrektes Bild gespeichert.

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)

bgr opencv imwrite

Bei der Bildverarbeitung mit Pillow can SIE ndarray mit Image.fromarray() in ein PIL.Image-Objekt umwandeln, aber in Pillow nimmt die Farbreihenfolge RGB (Rot, Grün, Blau) an.

Wenn daher das ndarray des von OpenCV imread() gelesenen Bildes in ein PIL.Image-Objekt konvertiert und gespeichert wird, wird das Bild mit der falschen Farbe gespeichert.

pil_img = Image.fromarray(im_cv)
pil_img.save('data/dst/lena_bgr_pillow.jpg')

bgr kissen sparen

Wenn Sie ndarray- und PIL.Image-Objekte konvertieren möchten, um sowohl Pillow- als auch OpenCV-Funktionen zu verwenden, müssen SIE BGR und RGB konvertieren.

Konvertieren Sie BGR und RGB mit der OpenCV-Funktion cvtColor()

Verschiedene Farbräume wie RGB, BGR, HSV können mit der OpenCV-Funktion cvtColor() ineinander konvertiert werden.

dst = cv2.cvtColor(src, code)

Den für den Parametercode anzugebenden Wert FINDEN SIE im following Dokument.

Wenn der Code cv2.COLOR_BGR2RGB ist, wird BGR in RGB konvertiert.

Bei der Konvertierung in RGB WIRD es als korrektes Bild gespeichert, auch wenn es nach der Konvertierung in ein PIL.Image-Objekt gespeichert wird.

im_rgb = cv2.cvtColor(im_cv, cv2.COLOR_BGR2RGB)

Image.fromarray(im_rgb).save('data/dst/lena_rgb_pillow.jpg')

RGB-Kissen speichern

Wenn es in RGB konvertiert und mit OpenCV imwrite() gespeichert WIRD, WIRD es ein falsches Farbbild sein.

cv2.imwrite('data/dst/lena_rgb_cv.jpg', im_rgb)

rgb opencv imwrite

Der Parametercode beim Konvertieren von RGB nach BGR lautet cv2.COLOR_RGB2BGR. Sie sterben, wenn Sie eine Bilddatei als PIL.Image lesen, konvertieren Sie sie in ndarray speichern und verwenden Sie sie mit 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)

BGR und RGB konvertieren, ohne cvtColor() zu verwenden

Die Konvertierung von BGR und RGB kann ohne Verwendung von cvtColor() realisiert werden.

Es gibt mehrere Möglichkeiten, zum Beispiel wie folgt:

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')