How can I convert an RGB image into grayscale in Python?

匿名 (未验证) 提交于 2019-12-03 02:26:02

问题:

I'm trying to use matplotlib to read in an RGB image and convert it to grayscale.

In matlab I use this:

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

In the matplotlib tutorial they don't cover it. They just read in the image

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

and then they slice the array, but that's not the same thing as converting RGB to grayscale from what I understand.

lum_img = img[:,:,0]

I find it hard to believe that numpy or matplotlib doesn't have a built-in function to convert from rgb to gray. Isn't this a common operation in image processing?

I wrote a very simple function that works with the image imported using imread in 5 minutes. It's horribly inefficient, but that's why I was hoping for a professional implementation built-in.

Sebastian has improved my function, but I'm still hoping to find the built-in one.

matlab's (NTSC/PAL) implementation:

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

回答1:

How about doing it with Pillow:

from PIL import Image img = Image.open('image.png').convert('LA') img.save('greyscale.png')

Using matplotlib and the formula

Y' = 0.299 R + 0.587 G + 0.114 B 

you could do:

import numpy as np import matplotlib.pyplot as plt import matplotlib.image as mpimg  def rgb2gray(rgb):     return np.dot(rgb[...,:3], [0.299, 0.587, 0.114])  img = mpimg.imread('image.png')      gray = rgb2gray(img)     plt.imshow(gray, cmap = plt.get_cmap('gray')) plt.show()


回答2:

You can also use scikit-image, which provides some functions to convert an image in ndarray, like rgb2gray.

from skimage import color from skimage import io  img = color.rgb2gray(io.imread('image.png'))

Notes: The weights used in this conversion are calibrated for contemporary CRT phosphors: Y = 0.2125 R + 0.7154 G + 0.0721 B

Alternatively, you can read image in grayscale by:

from skimage import io img = io.imread('image.png', as_grey=True)


回答3:

You can always read the image file as grayscale right from the beginning using imread from OpenCV:

img = cv2.imread('messi5.jpg', 0)

Furthermore, in case you want to read the image as RGB, do some processing and then convert to Gray Scale you could use cvtcolor from OpenCV:

gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)


回答4:

Three of the suggested methods were tested for speed with 1000 RGBA PNG images (224 x 256 pixels) running with Python 3.5 on Ubuntu 16.04 LTS (Xeon E5 2670 with SSD).

Average run times

pil : 1.037 seconds

scipy: 1.040 seconds

sk : 2.120 seconds

PIL and SciPy gave identical numpy arrays (ranging from 0 to 255). SkImage gives arrays from 0 to 1. In addition the colors are converted slightly different, see the example from the CUB-200 dataset.

SkImage:

PIL :

SciPy :

Original:

Diff :

Code

  1. Performance

    run_times = dict(sk=list(), pil=list(), scipy=list()) for t in range(100):     start_time = time.time()     for i in range(1000):         z = random.choice(filenames_png)         img = skimage.color.rgb2gray(skimage
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!