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

5voto

Avec OpenCV, c'est simple :

import cv2

im = cv2.imread("flower.jpg")

# To Grayscale
im = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
cv2.imwrite("grayscale.jpg", im)

# To Black & White
im = cv2.threshold(im, 127, 255, cv2.THRESH_BINARY)[1]
cv2.imwrite("black-white.jpg", im)

enter image description here

3voto

moose Points 4945

Je suis arrivé à cette question via Google, en cherchant un moyen de convertir une image déjà chargée en niveaux de gris.

Voici une façon de le faire avec SciPy :

import scipy.misc
import scipy.ndimage

# Load an example image
# Use scipy.ndimage.imread(file_name, mode='L') if you have your own
img = scipy.misc.face()

# Convert the image
R = img[:, :, 0]
G = img[:, :, 1]
B = img[:, :, 2]
img_gray = R * 299. / 1000 + G * 587. / 1000 + B * 114. / 1000

# Show the image
scipy.misc.imshow(img_gray)

2voto

Abdul Sadhiq Points 21

Lorsque les valeurs d'un pixel sur les trois canaux de couleur (RVB) sont identiques, ce pixel est toujours en niveaux de gris.

L'une des méthodes simples et intuitives pour convertir une image RVB en niveaux de gris consiste à prendre la moyenne de tous les canaux de couleur de chaque pixel et à attribuer la valeur à ce pixel.

import numpy as np
from PIL import Image

img=np.array(Image.open('sample.jpg')) #Input - Color image
gray_img=img.copy()

for clr in range(img.shape[2]):
    gray_img[:,:,clr]=img.mean(axis=2) #Take mean of all 3 color channels of each pixel and assign it back to that pixel(in copied image)

#plt.imshow(gray_img) #Result - Grayscale image

Image d'entrée : Input Image

Image de sortie : Output Image

-3voto

Qian Han Points 1
image=myCamera.getImage().crop(xx,xx,xx,xx).scale(xx,xx).greyscale()

Vous pouvez utiliser greyscale() directement pour la transformation.

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