Numpy Resize / Rescale Image

Me gustaría tomar una imagen y cambiar la escala de la imagen, mientras que es una matriz numpy.

Por ejemplo tengo esta imagen de una botella de coca-cola: botella-1

Lo que se traduce en una gran cantidad de formas (528, 203, 3) y quiero cambiar el tamaño para decir el tamaño de esta segunda imagen: bottle-2

Que tiene una forma de (140, 54, 3) .

¿Cómo cambio el tamaño de la imagen a una forma determinada mientras mantengo la imagen original? Otras respuestas sugieren eliminar todas las filas o la tercera fila, pero lo que quiero hacer es, básicamente, reducir la imagen como lo haría a través de un editor de imágenes pero en código Python. ¿Hay bibliotecas para hacer esto en numpy / SciPy?

Sí, puede instalar opencv (esta es una biblioteca utilizada para el procesamiento de imágenes y la visión artificial) y usar la función cv2.resize . Y por ejemplo usar:

 import cv2 import numpy as np img = cv2.imread('your_image.jpg') res = cv2.resize(img, dsize=(54, 140), interpolation=cv2.INTER_CUBIC) 

Aquí, img es una matriz numpy que contiene la imagen original, mientras que res es una matriz numpy que contiene la imagen redimensionada . Un aspecto importante es el parámetro de interpolation : hay varias maneras de cambiar el tamaño de una imagen. Sobre todo porque reduce la imagen y el tamaño de la imagen original no es un múltiplo del tamaño de la imagen redimensionada. Los posibles esquemas de interpolación son:

  • INTER_NEAREST – una interpolación del vecino más cercano
  • INTER_LINEAR : una interpolación bilineal (utilizada por defecto)
  • INTER_AREA – remuestreo utilizando la relación del área de píxeles. Puede ser un método preferido para la reducción de la imagen, ya que da resultados libres de muaré. Pero cuando la imagen se amplía, es similar al método INTER_NEAREST .
  • INTER_CUBIC : una interpolación bicúbica sobre un vecindario de 4×4 píxeles
  • INTER_LANCZOS4 : una interpolación de Lanczos en un vecindario de 8×8 píxeles

Al igual que con la mayoría de las opciones, no hay una “mejor” opción en el sentido de que para cada esquema de cambio de tamaño, hay escenarios en los que se puede preferir una estrategia sobre otra.

Si bien podría ser posible usar numpy solo para hacer esto, la operación no está integrada. Dicho esto, puedes usar scikit-image (que se basa en numpy) para hacer este tipo de manipulación de imágenes.

La documentación de cambio de escala de Scikit-Image está aquí

Por ejemplo, podrías hacer lo siguiente con tu imagen:

 from skimage.transform import resize bottle_resized = resize(bottle, (140, 54), anti_aliasing=True) 

Esto se hará cargo de cosas como la interpolación, anti-aliasing, etc. para usted.

El método imresize() SciPy fue otro método de cambio de tamaño, pero se eliminará a partir de SciPy v 1.3.0. SciPy se refiere al método de cambio de tamaño de imagen PIL : Image.resize(size, resample=0)

tamaño : el tamaño solicitado en píxeles, como 2-tupla: (ancho, alto).
remuestrear : un filtro de remuestreo opcional. Puede ser uno de PIL.Image.NEAREST (utilice el vecino más cercano), PIL.Image.BILINEAR (interpolación lineal), PIL.Image.BICUBIC (interpolación spline cúbica) o PIL.Image.LANCZOS (un filtro de reducción de resolución de alta calidad ). Si se omite, o si la imagen tiene el modo “1” o “P”, se establece PIL.Image.NEAREST.

Enlace aquí: http://sofes.miximages.com/image/Image.html‘,0) original_image = np.asarray(image_read) width , height = 452,452 resize_image = np.zeros(shape=(width,height)) for W in range(width): for H in range(height): new_width = int( W * original_image.shape[0] / width ) new_height = int( H * original_image.shape[1] / height ) resize_image[W][H] = original_image[new_width][new_height] print(“Resized image size : ” , resize_image.shape) cv2.imshow(resize_image) cv2.waitKey(0)