115 votes

OpenCV donne une couleur erronée aux images colorées lors du chargement

Je charge une image en couleur dans Python OpenCV et je trace la même chose. Cependant, les couleurs de l'image que j'obtiens sont toutes mélangées.

Voici le 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()

Voici l'image originale : enter image description here

Et voici l'image tracée : enter image description here

222voto

TobyD Points 804

OpenCV utilise BGR comme ordre de couleur par défaut pour les images, matplotlib utilise RGB. Lorsque vous affichez une image chargée avec OpenCv dans matplotlib, les canaux seront à l'envers.

Le moyen le plus simple de résoudre ce problème est d'utiliser OpenCV pour reconvertir explicitement l'image en RVB, comme vous le faites pour créer une image en niveaux de gris.

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

Et puis utilise ça dans ton intrigue.

12 votes

Vous pouvez également l'utiliser en une seule ligne lorsque vous lisez le fichier img = cv2.imread('lena_caption.png', cv2.COLOR_BGR2RGB)

25voto

okk Points 341

Comme alternative à la réponse précédente, vous pouvez utiliser (légèrement plus rapide)

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 par boucle (moyenne ± écart-type de 7 passages, 1 boucle chacun)

%timeit [cv2.imread(f)[...,::-1] for f in files]
220 ms ± 1,81 ms par boucle (moyenne ± écart-type de 7 passages, 1 boucle chacun)

9voto

Une solution simple en une ligne

np.flip(img, axis=-1) 

Cela peut se convertir dans les deux sens. De RGB à BGR, et de BGR à RGB.

1voto

Jaied Points 191

Si vous essayez de lire une image en utilisant OpenCV, il utilisera BGR par défaut. Vous devez donc utiliser une approche différente pour lire une image. J'ai fait les changements nécessaires à votre code pour obtenir la sortie désirée a été donnée ci-dessous.

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

img = cv2.cvtColor(cv2.imread('lena_caption.png'), cv2.COLOR_BGR2RGB)
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()

Sortie : enter image description here

1voto

BV2K Points 11

Vous pouvez également essayer cv2.IMREAD_UNCHANGED(). Voir plus ici pour voir comment il diffère de IMREAD_COLOR :

https://www.geeksforgeeks.org/python-opencv-cv2-imread-method/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X