如何将RGB图像转换为Python中的灰度图像?

我试图用matplotlib读取RGB图像并将其转换为灰度。

在matlab中,我使用这个:

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

在matplotlib教程中,他们没有涉及。 他们只是在图像中阅读

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

然后他们切片数组,但是这不是从我所了解的将RGB转换为灰度。

 lum_img = img[:,:,0] 

编辑:

我发现很难相信numpy或matplotlib没有内置函数来从rgb转换为灰色。 这不是image processing中的常见操作吗?

我写了一个非常简单的function,使用imread在5分钟内导入的图像。 这是非常低效的,但这就是为什么我希望内置专业实施。

塞巴斯蒂安改善了我的function,但我仍然希望find内置的一个。

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 

怎么样做与PIL :

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

使用matplotlib和公式

 Y' = 0.299 R + 0.587 G + 0.114 B 

你可以这样做:

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

您也可以使用scikit-image ,它提供了一些function来转换ndarray的图像,如rgb2gray

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

:此转换中使用的重量是针对当代CRT荧光粉校准的:Y = 0.2125 R + 0.7154 G + 0.0721 B

或者,您可以通过以下方式读取灰度图像:

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

您可以始终使用OpenCV中的imread从头开始以灰度forms读取图像文件:

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

此外,如果你想读取图像为RGB,做一些处理,然后转换为灰度,你可以使用OpenCV中的cvtcolor

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

最快和最新的方式是使用枕头 ,通过pip install Pillow

代码是:

 from PIL import Image img = Image.open('input_file.jpg').convert('L') img.save('output_file.jpg') 

本教程是作弊的,因为它是以RGB编码的灰度图像开始的,所以它们只是将单个颜色通道切片并将其视为灰度。 您需要做的基本步骤是从RGB色彩空间转换到一个色彩空间,该色彩空间用接近亮度/色度模型的东西(如YUV / YIQ或HSL / HSV)进行编码,然后切掉类似亮度的通道,并将其用作你的灰度图像。 matplotlib似乎没有提供转换为YUV / YIQ的机制,但它确实让您转换为HSV。

尝试使用matplotlib.colors.rgb_to_hsv(img)然后从数组中切出最后一个值(V)作为灰度。 这与亮度值并不完全相同,但这意味着您可以在matplotlib完成所有操作。

背景:

或者,可以使用PIL或内置的colorsys.rgb_to_yiq()将其转换为具有真实亮度值的色彩空间。 你也可以全力以赴,推出自己的亮度转换器,虽然这可能是矫枉过正的。

如果你已经使用NumPy / SciPy,你可以使用 :

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

Hth,dtk

在Ubuntu 16.04 LTS(带SSD的Xeon E5 2670)上运行Python 3.5的1000个RGBA PNG图像(224 x 256像素)testing了其中三种build议方法的速度。

平均运行时间

pil : 1.037秒

scipy: 1.040秒

sk : 2.120秒

PIL和SciPy给出了相同的numpy数组(范围从0到255)。 SkImage给出从0到1的数组。另外,颜色转换略有不同,请参阅CUB-200数据集中的示例。

SkImage: SkImage

PIL : PIL

SciPy : SciPy的

Original: 原版的

Diff : 在这里输入图像描述

  1. 性能

     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.io.imread(z)) run_times['sk'].append(time.time() - start_time) 

    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.io.imread(z)) run_times['sk'].append(time.time() - start_time)

     start_time = time.time() for i in range(1000): z = random.choice(filenames_png) img = np.array(Image.open(z).convert('L')) run_times['pil'].append(time.time() - start_time) start_time = time.time() for i in range(1000): z = random.choice(filenames_png) img = scipy.ndimage.imread(z, mode='L') run_times['scipy'].append(time.time() - start_time) 

    对于k,v在run_times.items()中:
    print('{:5}:{:0.3f} seconds'.format(k,sum(v)/ len(v)))

  2. 产量
     z = 'Cardinal_0007_3025810472.jpg' img1 = skimage.color.rgb2gray(skimage.io.imread(z)) * 255 IPython.display.display(PIL.Image.fromarray(img1).convert('RGB')) img2 = np.array(Image.open(z).convert('L')) IPython.display.display(PIL.Image.fromarray(img2)) img3 = scipy.ndimage.imread(z, mode='L') IPython.display.display(PIL.Image.fromarray(img3)) 
  3. 对照
     img_diff = np.ndarray(shape=img1.shape, dtype='float32') img_diff.fill(128) img_diff += (img1 - img3) img_diff -= img_diff.min() img_diff *= (255/img_diff.max()) IPython.display.display(PIL.Image.fromarray(img_diff).convert('RGB')) 
  4. import
     import skimage.color import skimage.io import random import time from PIL import Image import numpy as np import scipy.ndimage import IPython.display 
  5. 版本
     skimage. version 0.13.0 scipy. version 0.19.1 np. version 1.13.1 

我通过Google来到这个问题,寻找一种方法来将已经加载的图像转换为灰度。

这是一个用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) 
 image=myCamera.getImage().crop(xx,xx,xx,xx).scale(xx,xx).greyscale() 

您可以直接使用greyscale()来进行转换。