¿Cómo convertir imágenes a una array NumPy?

Las imágenes son una forma más fácil de representar el modelo de trabajo. En Machine Learning, Python usa los datos de la imagen en el formato de Altura, Ancho, Canal. es decir, las imágenes se convierten en Numpy Array en formato de altura, ancho y canal. 

Módulos necesarios:

  • NumPy: de forma predeterminada en versiones superiores de Python como 3.x en adelante, NumPy está disponible y, si no está disponible (en versiones inferiores), se puede instalar usando
pip install numpy
  • Pillow: Esto también debe instalarse explícitamente en versiones posteriores. Es una herramienta preferida de manipulación de imágenes. En Python 3, la biblioteca de Python de Pillow que no es más que la actualización de PIL únicamente. Se puede instalar usando
pip install Pillow

Uno puede verificar fácilmente la versión de Pillow instalada usando el siguiente código

Python3

import PIL
  
print('Installed Pillow Version:', PIL.__version__)

Producción:

Installed Pillow Version: 7.2.0

Cargando las imágenes a través de la biblioteca de Pillows

Busquemos una imagen que esté en formato PNG o JPEG. La imagen puede ser referida a través de su ruta. La clase de imagen es el corazón de PIL. Tiene la función open() que abre una imagen y se puede recuperar el formato de archivo digital, así como el formato de píxel.

Imagen utilizada:

Python3

from PIL import Image
  
  
# sample.png is the name of the image
# file and assuming that it is uploaded
# in the current directory or we need
# to give the path
image = Image.open('Sample.png')
  
# summarize some details about the image
print(image.format)
print(image.size)
print(image.mode)

Producción :

PNG
(400, 200)
RGB

Convertir una imagen en NumPy Array

Python proporciona muchos módulos y API para convertir una imagen en una array NumPy. Vamos a discutir algunos de ellos en detalle.

Usando el módulo NumPy

El módulo Numpy en sí mismo proporciona varios métodos para hacer lo mismo. Estos métodos son – 

Método 1: Usar la función asarray()

La función asarray() se usa para convertir imágenes PIL en arrays NumPy. Esta función convierte la

Python3

# Import the necessary libraries
from PIL import Image
from numpy import asarray
  
  
# load the image and convert into
# numpy array
img = Image.open('Sample.png')
  
# asarray() class is used to convert
# PIL images into NumPy arrays
numpydata = asarray(img)
  
# <class 'numpy.ndarray'>
print(type(numpydata))
  
#  shape
print(numpydata.shape)

Producción :

<class 'numpy.ndarray'>
(200, 400, 3)

Método 2: Usar la función numpy.array()

Mediante el uso de la función numpy.array() que toma una imagen como argumento y la convierte en una array NumPy

Python3

from PIL import Image
import numpy
  
  
img= Image.open("Sample.png")
np_img = numpy.array(img)
  
print(np_img.shape)

Producción :

(200, 400, 3)

Para obtener el valor de cada píxel de la imagen de la array NumPy, necesitamos imprimir los datos recuperados que se obtuvieron de la función asarray() o de la función array().

Python3

# Import the necessary libraries
from PIL import Image
from numpy import asarray
  
  
# load the image and convert into 
# numpy array
img = Image.open('Sample.png')
numpydata = asarray(img)
  
# data
print(numpydata)

Producción :

[[[111  60   0]
 [116  65   0]
 [122  69   0]
 ...
 [ 97  47   0]
 [ 99  47   0]
 [100  49   0]]
[[111  61   0]
 [118  65   0]
 [122  69   0]
 ...
 [ 97  47   0]
 [ 99  48   0]
 [100  49   0]]
[[118  65   0]
 [122  69   0]
 [126  73   3]
 ...
 [ 98  48   0]
 [100  49   0]
 [100  49   0]]
...
[[ 96  44   7]
 [ 95  43   6]
 [ 93  41   4]
 ...
 [225  80   3]
 [228  80   0]
 [229  78   0]]
[[ 93  40   6]
 [ 90  37   5]
 [ 85  32   0]
 ...
 [226  81   4]
 [231  80   1]
 [232  79   1]]
[[ 89  36   4]
 [ 84  31   0]
 [ 79  26   0]
 ...
 [228  81   4]
 [232  81   4]
 [233  80   2]]]

Recuperar la imagen de Numpy Array convertido

La función Image.fromarray() ayuda a recuperar la imagen de la array numpy convertida. Recuperamos los píxeles también después de convertir de un lado a otro. Por lo tanto, esto es muy eficiente.

Python3

# Import the necessary libraries
from PIL import Image
from numpy import asarray
  
  
# load the image and convert into 
# numpy array
img = Image.open('Sample.png')
numpydata = asarray(img)
  
print(type(numpydata))
  
#  shape
print(numpydata.shape)
  
# Below is the way of creating Pillow 
# image from our numpyarray
pilImage = Image.fromarray(numpydata)
print(type(pilImage))
  
# Let us check  image details
print(pilImage.mode)
print(pilImage.size)

Producción :

<class 'numpy.ndarray'>
(200, 400, 3)
<class 'PIL.Image.Image'>
RGB
(400, 200)

Conversión de imágenes usando la API de Keras

Keras API proporciona las funciones para cargar, convertir y guardar datos de imagen. Es posible ejecutar Keras en la parte superior del marco TensorFlow y, por lo tanto, es obligatorio tenerlo. Las imágenes de visión artificial de aprendizaje profundo requieren la API de Keras. Para instalarlo, escriba el siguiente comando en la terminal 

pip install keras

Como Keras requiere TensorFlow 2.2 o superior. Si no está allí, necesita instalarlo. Para instalarlo, escriba el siguiente comando en la terminal.

pip install tensorflow

Python3

from keras.preprocessing.image import load_img
import warnings
  
# load the image via load_img 
# function
img = load_img('sample.png')
  
# details about the image printed below
print(type(img)) 
print(img.format)
print(img.mode)
print(img.size)

Producción :

<class 'PIL.PngImagePlugin.PngImageFile'>
PNG
RGB
(400, 200)

Con la API de Keras, convierta imágenes a Numpy Array y revierta la imagen de Numpy Array

Python3

from keras.preprocessing.image import load_img
import warnings
from keras.preprocessing.image import img_to_array
from keras.preprocessing.image import array_to_img
  
  
# load the image via load_img function
img = load_img('sample.png')
  
# details about the image printed below
print(type(img))
print(img.format)
print(img.mode)
print(img.size)
  
# convert the given image into  numpy array
img_numpy_array = img_to_array(img)
print("Image is converted and NumPy array information :")
  
# <class 'numpy.ndarray'>
print(type(img_numpy_array))
  
# type: float32
print("type:", img_numpy_array.dtype)
  
# shape: (200, 400, 3)
print("shape:", img_numpy_array.shape)
  
# convert back to image
img_pil_from_numpy_array = array_to_img(img_numpy_array)
  
# <class 'PIL.PngImagePlugin.PngImageFile'>
print("converting NumPy array into image:",
      type(img_pil_from_numpy_array))

Producción :

<class 'PIL.PngImagePlugin.PngImageFile'>
PNG
RGB
(400, 200)
Image is converted and NumPy array information :
<class 'numpy.ndarray'>
type: float32
shape: (200, 400, 3)
converting NumPy array into image: <class 'PIL.Image.Image'>

A partir del resultado anterior, podemos comprobar que los tipos de imagen de origen PIL.Image.Image y de destino son los mismos.

Uso de la biblioteca OpenCV

La versión OpenCV de 3.x tiene marcos DNN y Caffe, y son muy útiles para resolver problemas de aprendizaje profundo. Se puede instalar usando

pip install opencv-contrib-python

El paquete cv2 tiene los siguientes métodos

  • La función imread() se usa para cargar la imagen y también lee la imagen dada (imagen PIL) en el formato de array NumPy. 
  • Luego necesitamos convertir el color de la imagen de BGR a RGB. 
  • imwrite() se utiliza para guardar la imagen en el archivo.

Python3

import cv2
  
image = cv2.imread('Sample.png')
  
# BGR -> RGB
img = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
  
cv2.imwrite('opncv_sample.png', img) 
print (type(img))

Producción :

<class 'numpy.ndarray'>

Conclusión

Python es una herramienta muy flexible y hemos visto formas de convertir imágenes en Numpy Array y de manera similar volver a imágenes usando diferentes API. Manipulando la array convertida y formando diferentes datos de imagen, uno puede alimentar redes neuronales de aprendizaje profundo.

Publicación traducida automáticamente

Artículo escrito por priyarajtt y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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