304 votes

Comment convertir une image RVB en niveaux de gris en Python ?

J'essaie d'utiliser matplotlib pour lire une image RVB et la convertir en niveaux de gris.

Dans matlab, j'utilise ceci :

img = rgb2gray(imread('image.png'));

Dans le cadre de la matplotlib tutorial ils ne le couvrent pas. Ils se contentent de lire dans l'image

import matplotlib.image as mpimg
img = mpimg.imread('image.png')

puis ils découpent le tableau, mais ce n'est pas la même chose que de convertir RVB en niveaux de gris, d'après ce que j'ai compris.

lum_img = img[:,:,0]

J'ai du mal à croire que numpy ou matplotlib n'aient pas une fonction intégrée pour convertir de rgb en gray. N'est-ce pas une opération courante dans le traitement des images ?

J'ai écrit une fonction très simple qui fonctionne avec l'image importée à l'aide de imread en 5 minutes. C'est terriblement inefficace, mais c'est pourquoi j'espérais une mise en œuvre professionnelle intégrée.

Sebastian a amélioré mon fonctionnement, mais j'espère toujours trouver l'appareil intégré.

l'implémentation de matlab (NTSC/PAL) :

import numpy as np

def rgb2gray(rgb):

    r, g, b = rgb[:,:,0], rgb[:,:,1], rgb[:,:,2]
    gray = 0.2989 * r + 0.5870 * g + 0.1140 * b

    return gray

12voto

Silas Ray Points 11950

Le tutoriel triche parce qu'il part d'une image en niveaux de gris encodée en RVB, et qu'il ne fait que découper un seul canal de couleur et le traiter comme un niveau de gris. Les étapes de base à suivre consistent à transformer l'espace colorimétrique RVB en un espace colorimétrique qui code avec quelque chose qui se rapproche du modèle luma/chroma, comme YUV/YIQ ou HSL/HSV, puis à découper le canal de type luma et à l'utiliser comme image en niveaux de gris. matplotlib ne semble pas fournir de mécanisme de conversion en YUV/YIQ, mais il permet de convertir en HSV.

Essayez d'utiliser matplotlib.colors.rgb_to_hsv(img) puis en découpant la dernière valeur (V) du tableau pour obtenir les niveaux de gris. Ce n'est pas tout à fait la même chose qu'une valeur luma, mais cela signifie que vous pouvez tout faire en matplotlib .

Contexte :

Vous pouvez également utiliser PIL ou la fonction intégrée colorsys.rgb_to_yiq() pour convertir l'espace colorimétrique avec une vraie valeur luma. Vous pouvez également vous lancer à fond et créer votre propre convertisseur luma uniquement, bien que cela soit probablement exagéré.

11voto

iNet Points 1

Utilisation cette formule

Y' = 0.299 R + 0.587 G + 0.114 B 

Nous pouvons faire

import imageio
import numpy as np
import matplotlib.pyplot as plt

pic = imageio.imread('(image)')
gray = lambda rgb : np.dot(rgb[... , :3] , [0.299 , 0.587, 0.114]) 
gray = gray(pic)  
plt.imshow(gray, cmap = plt.get_cmap(name = 'gray'))

Toutefois, le GIMP Le logiciel de conversion des couleurs en niveaux de gris dispose de trois algorithmes pour effectuer cette tâche.

9voto

am.mansour Points 91

Vous pourriez faire :

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg

def rgb_to_gray(img):
        grayImage = np.zeros(img.shape)
        R = np.array(img[:, :, 0])
        G = np.array(img[:, :, 1])
        B = np.array(img[:, :, 2])

        R = (R *.299)
        G = (G *.587)
        B = (B *.114)

        Avg = (R+G+B)
        grayImage = img.copy()

        for i in range(3):
           grayImage[:,:,i] = Avg

        return grayImage       

image = mpimg.imread("your_image.png")   
grayImage = rgb_to_gray(image)  
plt.imshow(grayImage)
plt.show()

8voto

dtk Points 548

Si vous utilisez déjà NumPy/SciPy, vous pouvez ainsi que l'utilisation de :

scipy.ndimage.imread(file_name, mode='L')

5voto

naren Points 1378

Utiliser img.Convert(), supporte les modes "L", "RGB" et "CMYK".

import numpy as np
from PIL import Image

img = Image.open("IMG/center_2018_02_03_00_34_32_784.jpg")
img.convert('L')

print np.array(img)

Sortie :

[[135 123 134 ...,  30   3  14]
 [137 130 137 ...,   9  20  13]
 [170 177 183 ...,  14  10 250]
 ..., 
 [112  99  91 ...,  90  88  80]
 [ 95 103 111 ..., 102  85 103]
 [112  96  86 ..., 182 148 114]]

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