OpenCV gibt farbigen Bildern beim Laden eine falsche Farbe

73

Ich lade ein Farbbild in Python OpenCV und zeichne dasselbe. Das Bild, das ich bekomme, hat jedoch alle Farben durcheinander.

Hier ist der Code:

import cv2
import numpy as np
from numpy import array, arange, uint8 
from matplotlib import pyplot as plt


img = cv2.imread('lena_caption.png', cv2.IMREAD_COLOR)
bw_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

images = []
images.append(img)
images.append(bw_img)

titles = ['Original Image','BW Image']

for i in xrange(len(images)):
    plt.subplot(1,2,i+1),plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])

plt.show()

Hier ist das Originalbild: Geben Sie hier die Bildbeschreibung ein

Und hier ist das geplottete Bild: Geben Sie hier die Bildbeschreibung ein

bholagabbar
quelle

Antworten:

157

OpenCV verwendet BGR als Standardfarbreihenfolge für Bilder, matplotlib verwendet RGB. Wenn Sie ein mit OpenCv geladenes Bild in matplotlib anzeigen, werden die Kanäle von hinten nach vorne angezeigt.

Die einfachste Möglichkeit, dies zu beheben, besteht darin, OpenCV zu verwenden, um es explizit wieder in RGB zu konvertieren, ähnlich wie beim Erstellen des Graustufenbilds.

RGB_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

Und dann verwenden Sie das in Ihrer Handlung.

TobyD
quelle
7
Sie können es auch in einer Zeile verwenden, wenn Sie die Datei lesenimg = cv2.imread('lena_caption.png', cv2.COLOR_BGR2RGB)
Spiral Out
17

Alternativ zur vorherigen Antwort können Sie (etwas schneller) verwenden

img = cv2.imread('lena_caption.png')[...,::-1]

%timeit [cv2.cvtColor(cv2.imread(f), cv2.COLOR_BGR2RGB) for f in files]
231 ms ± 3,08 ms pro Schleife (Mittelwert ± Standardabweichung von 7 Läufen, jeweils 1 Schleife)

%timeit [cv2.imread(f)[...,::-1] for f in files]
220 ms ± 1,81 ms pro Schleife (Mittelwert ± Standardabweichung von 7 Läufen, jeweils 1 Schleife)

okk
quelle
3
NEIN. Und das ist der Grund: answers.opencv.org/question/219040/…
baldr
Könnten Sie bitte erklären, wie es sich von RGB_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
Avinash Singh