Saltar al contenido

¿Cómo puedo convertir una imagen RGB en escala de grises en Python?

Este enunciado fue aprobado por especialistas para que tengas la garantía de la veracidad de este escrito.

Solución:

¿Qué tal hacerlo con Pillow?

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

Usando matplotlib y la fórmula

Y' = 0.2989 R + 0.5870 G + 0.1140 B 

Podrías hacerlo:

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

También puede usar scikit-image, que proporciona algunas funciones para convertir una imagen en ndarrayme gusta rgb2gray.

from skimage import color
from skimage import io

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

notas: Los pesos utilizados en esta conversión están calibrados para fósforos CRT contemporáneos: Y = 0,2125 R + 0,7154 G + 0,0721 B

Alternativamente, puede leer la imagen en escala de grises haciendo lo siguiente:

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

Se probó la velocidad de tres de los métodos sugeridos con 1000 imágenes PNG RGBA (224 x 256 píxeles) que se ejecutan con Python 3.5 en Ubuntu 16.04 LTS (Xeon E5 2670 con SSD).

Tiempos promedio de ejecución

pil : 1.037 segundos

scipy: 1.040 segundos

sk : 2.120 segundos

PIL y SciPy dieron resultados idénticos numpy matrices (que van de 0 a 255). SkImage da matrices de 0 a 1. Además, los colores se convierten ligeramente diferentes, vea el ejemplo del conjunto de datos CUB-200.

SkImage:SkImage

PIL :PIL

SciPy :SciPy

Original:Original

Diff :ingrese la descripción de la imagen aquí

Código

  1. Rendimiento

    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)
    

    para k, v en run_times.items(): print(':5: :0.3f segundos'.format(k, sum(v) / len(v)))

  2. Producción
    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. Comparación
    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. Importaciones
    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. Versiones
    skimage.version
    0.13.0
    scipy.version
    0.19.1
    np.version
    1.13.1
    

Te mostramos las comentarios y valoraciones de los lectores

Si piensas que te ha resultado provechoso nuestro artículo, sería de mucha ayuda si lo compartieras con otros juniors así nos ayudas a dar difusión a nuestra información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *