如何将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:
PIL :
SciPy :
Original:
Diff :
码
-
性能
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))) - 产量
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))
- 对照
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'))
- 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
- 版本
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()
来进行转换。