En este artículo, vamos a conocer el enfoque más ingenuo y eficiente para recortar una imagen sin usar ningún módulo adicional.
El módulo numpy es una biblioteca de Python que se utiliza para trabajar con arrays y grandes conjuntos de datos. Python no tiene ningún soporte nativo para arreglos, a diferencia de otros lenguajes de alto nivel como C, C++, Java, etc., que proporciona una implementación para arreglos de forma nativa. Python tiene listas vinculadas, lo que resuelve el problema de la asignación estática (en su mayoría) y permite el almacenamiento de datos heterogéneos, pero no permite el almacenamiento contiguo de datos. Numpy compensa este inconveniente al introducir arrays en el lenguaje que son una estructura de datos homogénea y se almacenan en ubicaciones de memoria contiguas.
Dado que los datos dentro de una imagen (excluyendo la información del encabezado) son homogéneos, y generalmente se accede a ellos de forma secuencial o mediante acceso directo (mediante la adición de compensaciones), el uso de arrays para almacenar datos de píxeles de imagen permite operaciones más rápidas en la imagen. En este artículo, veremos cómo recortar una imagen usando arrays Numpy (que contienen información de píxeles).
Hay varios métodos en muchos módulos para recortar una imagen, el enfoque más ingenuo y eficiente para recortar una imagen es utilizar la indexación de arrays numpy .
Uso de la indexación para recortar imágenes
Dado que Numpy no admite el método de recorte de imágenes de forma nativa (ya que no es una biblioteca de procesamiento de imágenes), podemos usar los métodos de indexación para cumplir nuestro propósito. Para la demostración, estaríamos usando la siguiente imagen: –
Estaríamos recortando la imagen de arriba de manera que el logo en el medio ocupe una gran parte de la imagen.
Dado que recortar la imagen *generalmente es algo manual, tendríamos que obtener las coordenadas de la región de interés de antemano. Se requieren 4 coordenadas (o un par de tuplas de tamaño 2) para recortar. El primer conjunto de coordenadas especifica la esquina superior izquierda de la ROI (o Bbox) y los dos siguientes indican las coordenadas de la esquina inferior derecha de la ROI. Para nuestro caso, las coordenadas para el ROI serían (1413, 653) y (2361, 1385) (suponiendo que se usa la indexación de fila principal). Para mostrar y leer la imagen, contaríamos con la ayuda de la biblioteca Pillow , que es una biblioteca de procesamiento de imágenes en python.
A continuación se muestra el programa para recortar una imagen dada:
Python3
# Import required modules from PIL import Image import numpy as np # Load image image = Image.open('W3.jpg') # Convert image to array image_arr = numpy.array(image) # Crop image image_arr = image_arr[700:1400, 1450:2361] # Convert array to image image = Image.fromarray(image_arr) # Display image image.show()
Producción:
Explicación:
- En primer lugar, importamos el módulo de imagen de la biblioteca PIL (o Pillow). Luego importamos la biblioteca Numpy bajo el alias np (convención común). Después de lo cual creamos un objeto Imagen de nuestra imagen deseada ( W3.jpg ), y almacenamos el objeto en la imagen variable . Entonces, la variable de imagen es de tipo PIL.JpegImagePlugin.JpegImageFile.
- Para crear una array Numpy a partir de este objeto, la pasamos a través del método np.array(), que extrajo todos los datos de píxeles de la imagen y los almacenó en la variable image_arr . Esto nos dio como resultado tener una array Numpy de forma (2160, 3840, 3) .
- Luego cortamos la array de cada dimensión. En la instrucción image_arr[700:1400, 1450:2361], el 700 indica la fila inicial y el 1400 indica la fila final. Donde, 1450 representa la columna inicial y 2316 representa la columna final. Todos estos valores representan el píxel en la ubicación, por lo tanto, el recorte con las coordenadas superiores izquierdas de (1450, 700) y las coordenadas inferiores izquierdas de (2361, 1400) .
- Finalmente, volvimos a convertir la array Numpy en una imagen usando Image.fromarray() . Al final mostramos la imagen usando la función show() .