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 ndarray
me 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:
PIL :
SciPy :
Original:
Diff :
Código
-
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)))
- 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))
- 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'))
- 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
- 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.