J'ai trouvé la réponse précédente liée à une conversion plus générale à partir d'une image RVB ici : Convertir l'image du format PIL au format openCV

Je voudrais connaître la différence quand une image doit être lue en format de gris.

images = [None, None]

images[0] = Image.open('image1')
images[1] = Image.open('image2')

print(type(images[0]))

a = np.array(images[0])
b = np.array(images[1])

print(type(a))

im_template = cv2.imread(a, 0)
im_source = cv2.imread(b, 0)

J'obtiens la sortie suivante:

<class 'PIL.JpegImagePlugin.JpegImageFile'>
<class 'numpy.ndarray'>

Même si je suis capable de convertir l'image en ndarray, cv2 dit: "mauvais type d'argument pour un fonctionnement intégré". Je n'ai pas besoin d'une conversion RVB en BGR. Que dois-je considérer d'autre en passant un argument de lecture cv2?

2
abk 6 mars 2019 à 19:22

2 réponses

Meilleure réponse

Vous vous rendez la vie inutilement difficile. Si vous souhaitez charger une image en niveaux de gris et l'utiliser avec OpenCV, vous devez simplement faire:

im = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)

Et c'est tout. Pas besoin d'utiliser PIL (qui est plus lent), pas besoin d'utiliser cvtColor() car vous avez déjà gaspillé toute la mémoire en le lisant dans BGR de toute façon.

Si vous voulez absolument le lire en utilisant PIL (pour une raison étrange), utilisez:

import numpy as np
from PIL import Image

# Read in and make greyscale
PILim = Image.open('image.jpg').convert('L')

# Make Numpy/OpenCV-compatible version
openCVim = np.array(PILim)

Soit dit en passant, si vous souhaitez revenir à une image PIL à partir d'une image OpenCV / Numpy, utilisez:

PILim = Image.fromarray(openCVim)
4
Mark Setchell 6 mars 2019 à 16:49

Puisque vous avez déjà chargé l'image, vous devez utiliser une fonction de conversion d'image:

im_template = cv2.cvtColor(a, cv2.COLOR_RGB2GRAY)
im_source = cv2.cvtColor(b, cv2.COLOR_RGB2GRAY)
1
Pärt Johanson 6 mars 2019 à 16:54