如何在Python中将RGB图像转换为灰度?
我正在尝试使用如何在Python中将RGB图像转换为灰度?,python,matplotlib,Python,Matplotlib,我正在尝试使用matplotlib读取RGB图像并将其转换为灰度 在matlab中,我使用: img = rgb2gray(imread('image.png')); 实际上,他们没有覆盖它。他们只是在图像中阅读 import matplotlib.image as mpimg img = mpimg.imread('image.png') 然后对阵列进行切片,但这与我所理解的将RGB转换为灰度不同 lum_img = img[:,:,0] 我发现很难相信numpy或matplotlib没
matplotlib
读取RGB图像并将其转换为灰度
在matlab中,我使用:
img = rgb2gray(imread('image.png'));
实际上,他们没有覆盖它。他们只是在图像中阅读
import matplotlib.image as mpimg
img = mpimg.imread('image.png')
然后对阵列进行切片,但这与我所理解的将RGB转换为灰度不同
lum_img = img[:,:,0]
我发现很难相信numpy或matplotlib没有内置的函数来将rgb转换为灰色。这不是图像处理中的常见操作吗
我编写了一个非常简单的函数,可以在5分钟内使用imread
导入图像。它的效率非常低,但这就是为什么我希望内置一个专业的实现
塞巴斯蒂安改进了我的功能,但我仍然希望找到内置的
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
使用以下工具进行操作如何:
使用matplotlib和 你可以做:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
def rgb2gray(rgb):
return np.dot(rgb[...,:3], [0.2989, 0.5870, 0.1140])
img = mpimg.imread('image.png')
gray = rgb2gray(img)
plt.imshow(gray, cmap=plt.get_cmap('gray'), vmin=0, vmax=1)
plt.show()
该教程是作弊,因为它是从一个用RGB编码的灰度图像开始的,所以他们只是将一个颜色通道切片,并将其视为灰度。您需要执行的基本步骤是从RGB颜色空间转换为使用近似亮度/色度模型(如YUV/YIQ或HSL/HSV)进行编码的颜色空间,然后切掉类似亮度的通道并将其用作灰度图像
matplotlib
似乎不提供转换为YUV/YIQ的机制,但它确实允许您转换为HSV
尝试使用matplotlib.colors.rgb_to_hsv(img)
然后从数组中为灰度切片最后一个值(V)。它与luma值不完全相同,但这意味着您可以在matplotlib
中完成所有操作
背景:
或者,您可以使用PIL或内置的
colorsys.rgb_to_yiq()
转换为具有真实亮度值的颜色空间。您也可以全力以赴,滚动您自己的luma-only转换器,尽管这可能有点过分。您始终可以使用from OpenCV从一开始就将图像文件读取为灰度:
img = cv2.imread('messi5.jpg', 0)
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
此外,如果您想以RGB格式读取图像,请进行一些处理,然后转换为可从OpenCV使用的灰度:
img = cv2.imread('messi5.jpg', 0)
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
您还可以使用,它提供了一些函数来转换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_gray=True)
最快和最新的方法是使用,通过
pip安装枕头安装
代码是:
from PIL import Image
img = Image.open('input_file.jpg').convert('L')
img.save('output_file.jpg')
您可以直接使用greyscale()
进行转换。如果您已经在使用NumPy/SciPy,您可以:
scipy.ndimage.imread(文件名,mode='L')
我通过谷歌找到了这个问题,正在寻找一种将已加载的图像转换为灰度的方法
以下是使用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)
在Ubuntu 16.04 LTS(Xeon E5 2670和SSD)上,使用Python 3.5运行1000个RGBA PNG图像(224 x 256像素),对其中三种建议的方法进行了速度测试
平均运行时间
pil:
1.037秒
scipy:
1.040秒
sk:
2.120秒
PIL和SciPy给出了相同的numpy
数组(范围从0到255)。SkImage提供从0到1的数组。此外,颜色转换略有不同,请参见
浏览:
PIL:
SciPy:
原件:
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)
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.items():
打印({:5}:{:0.3f}秒)。格式(k,和(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))
比较
import skimage.color
import skimage.io
import random
import time
from PIL import Image
import numpy as np
import scipy.ndimage
import IPython.display
img_diff=np.ndarray(shape=img1.shape,dtype='float32')
img_差异填充(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'))
进口
导入skimage.color
导入skimage.io
随机输入
导入时间
从PIL导入图像
将numpy作为np导入
导入scipy.ndimage
导入IPython.display
版本
浏览。版本
0.13.0
scipy.版本
0.19.1
np.版本
1.13.1
你可以做:
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)
使用img.Convert(),支持“L”、“RGB”和“CMYK.”模式
[[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]]
输出:
Y' = 0.299 R + 0.587 G + 0.114 B
使用
我们能做到
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)
但是,将颜色转换为灰度图像软件有三种算法来完成这项任务。使用OpenCV,其简单之处在于:
如果出于其他原因必须使用matplotlib
,他应该能够使用内置的colorsys.rgb_to_yiq()
进行变换,再加上一个切片来获得luma通道。为什么.convert('LA')
?为什么不.convert('gray')
?似乎不必要的神秘。转换函数中没有提到任何关于“LA”的内容。使用PIL:无法将模式LA写入JPEG
,我需要使用L模式而不是latthisimg=Image.open('Image.png')。转换('LA')
需要是img=Image.open('Image.png')。转换('L')
@BluePython:LA
模式具有亮度(亮度)还有阿尔法。如果使用LA
模式,则greyscale.png
将是一个RGBA图像,保留image.png
的alpha通道。如果你
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
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()
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)
[[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]]
Y' = 0.299 R + 0.587 G + 0.114 B
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'))
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)