it-swarm.com.de

OpenCV gibt farbigen Bildern beim Laden falsche Farbe

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

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:  enter image description here

Und hier ist das geplottete Bild:  enter image description here

32
bholagabbar

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 wieder nach vorne verschoben. 

Die einfachste Möglichkeit, dies zu beheben, ist die Verwendung von OpenCV, um es explizit zurück 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.

73
TobyD

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

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, je 1 Schleife)

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

10
OKK