¿Cómo convertir una imagen en una array NumPy y guardarla en un archivo CSV usando Python?

Veamos cómo convertir una imagen en una array NumPy y luego guardar esa array en un archivo CSV en Python. Primero, aprenderemos cómo convertir una imagen en un ndarray numpy. Hay muchos métodos para convertir una imagen a ndarray, algunos de ellos son:

Método 1: usar la biblioteca PIL y NumPy .

Usaremos PIL.Image.open() y numpy.asarray() .

Ejemplo:

Python3

# import required libraries
from PIL import Image
import numpy as gfg
 
# read an image
img = Image.open('geeksforgeeks.jpg')
 
# convert image object into array
imageToMatrice = gfg.asarray(img)
 
# printing shape of image
print(imageToMatrice.shape)

Producción:

(251, 335, 3)

Método 2: usar la biblioteca Matplotlib .

Usaremos el método matplotlib.image.imread() .

Ejemplo:

Python3

# import library
from matplotlib.image import imread
 
# read an image
imageToMatrice  = imread('geeksforgeeks.jpg')
 
# show shape of the image
print(imageToMatrice.shape)

Producción:

(251, 335, 3)

Ahora, la variable imageToMatrice contiene el ndarray que se obtiene después de la conversión de la imagen dada. 

La dimensión de la array obtenida se decide por cuántos canales están presentes en la imagen:

  • Para una imagen en escala de grises o en blanco y negro: solo hay un canal presente, por lo tanto, la forma de las arrays sería (n, n) donde n representa la dimensión de las imágenes (píxeles), y los valores dentro de la array van desde 0 a 255.
  • Para imagen a color o RGB: Renderizará un tensor de 3 canales, por lo que la forma de las arrays sería (n, n,3). Cada canal es una array (n, n) donde cada entrada representa respectivamente el nivel de rojo, verde o azul en la ubicación real dentro de la imagen.

Usaremos dos métodos para hacer lo mismo, el primer método usando la biblioteca numpy y el segundo método usando la biblioteca pandas:

Nota: solo podemos guardar una array 1D o 2D en un archivo, por lo tanto, no habría ningún problema en la imagen en escala de grises o en blanco y negro, ya que es una array 2D, pero debemos asegurarnos de que esto funcione para una imagen en color o en blanco. Imagen RGB, que es una array 3D.

Método 1: usar la biblioteca NumPy .

Usaremos numpy.savetxt() y numpy.loadtxt().

Ejemplo:

Python3

# import required libraries
import numpy as gfg
import matplotlib.image as img
 
# read an image
imageMat = img.imread('gfg.jpg')
print("Image shape:", imageMat.shape)
 
# if image is colored (RGB)
if(imageMat.shape[2] == 3):
   
  # reshape it from 3D matrice to 2D matrice
  imageMat_reshape = imageMat.reshape(imageMat.shape[0],
                                      -1)
  print("Reshaping to 2D array:",
        imageMat_reshape.shape)
 
# if image is grayscale
else:
  # remain as it is
  imageMat_reshape = imageMat
     
# saving matrice to .csv file
gfg.savetxt('geek.csv',
            imageMat_reshape)
 
# retrieving matrice from the .csv file
loaded_2D_mat = gfg.loadtxt('geek.csv')
 
# reshaping it to 3D matrice
loaded_mat = loaded_2D_mat.reshape(loaded_2D_mat.shape[0],
                                   loaded_2D_mat.shape[1] // imageMat.shape[2],
                                   imageMat.shape[2])
 
print("Image shape of loaded Image:",
      loaded_mat.shape)
 
# check if both matrice have same shape or not
if((imageMat == loaded_mat).all()):
   
  print("\n\nYes",
        "The loaded matrice from CSV file is same as original image matrice")

Producción:

Forma de la imagen: (251, 335, 3) 
Transformación a array 2D: (251, 1005) 
Forma de la imagen de la imagen cargada: (251, 335, 3)
Sí La array cargada del archivo CSV es la misma que la array de la imagen original

Método 2: Usar la biblioteca de Pandas .

Usaremos el método pandas.Dataframe( ) y pandas.Dataframe() .to_csv() .

Python3

# import required libraries
import numpy as gfg
import matplotlib.image as img
import pandas as pd
 
# read an image
imageMat = img.imread('gfg.jpg')
print("Image shape:",
      imageMat.shape)
 
# if image is colored (RGB)
if(imageMat.shape[2] == 3):
   
  # reshape it from 3D matrice to 2D matrice
  imageMat_reshape = imageMat.reshape(imageMat.shape[0],
                                      -1)
  print("Reshaping to 2D array:",
        imageMat_reshape.shape)
 
# if image is grayscale
else:
  # remain as it is
  imageMat_reshape = imageMat
     
# converting it to dataframe.
mat_df = pd.DataFrame(imageMat_reshape)
 
# exporting dataframe to CSV file.
mat_df.to_csv('gfgfile.csv',
              header = None,
              index = None)
 
# retrieving dataframe from CSV file
loaded_df = pd.read_csv('gfgfile.csv',
                        sep = ',',
                        header = None)
# getting matrice values.
loaded_2D_mat = loaded_df.values
 
# reshaping it to 3D matrice
loaded_mat = loaded_2D_mat.reshape(loaded_2D_mat.shape[0],
                                   loaded_2D_mat.shape[1] // imageMat.shape[2],
                                   imageMat.shape[2])
 
print("Image shape of loaded Image :",
      loaded_mat.shape)
 
# check if both matrice have same shape or not
if((imageMat == loaded_mat).all()):
  print("\n\nYes",
        "The loaded matrice from CSV file is same as original image matrice")

Producción:

Forma de la imagen: (251, 335, 3) 
Transformación a array 2D: (251, 1005) 
Forma de la imagen de la imagen cargada: (251, 335, 3)
Sí La array cargada del archivo CSV es la misma que la array de la imagen original

Publicación traducida automáticamente

Artículo escrito por chetansinha 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 *