skimage imresize example python image numpy scipy resize

python - imresize - skimage resize example



Numpy Resize/Rescale Image (4)

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 una tupla de 2: (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í: https://pillow.readthedocs.io/en/3.1.x/reference/Image.html#PIL.Image.Image.resize

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: bottle-1

Lo que se traduce en una gran variedad de formas (528, 203, 3) y quiero cambiar el tamaño para indicar 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 usada para el procesamiento de imágenes y la visión por computadora) 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 usando una relación de área de píxeles. Puede ser un método preferido para la decimació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 4x4 píxeles
  • INTER_LANCZOS4 : una interpolación de Lanczos en un vecindario de 8x8 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 es posible usar solo numpy 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 reescalado de Scikit-Image está here .

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.


import cv2 import numpy as np image_read = cv2.imread(''filename.jpg'',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)