Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中将RGB图像转换为灰度?_Python_Matplotlib - Fatal编程技术网

如何在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模式而不是latthis
    img=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)