Redimensionar múltiples imágenes con OpenCV al tamaño cuadrado sin relleno.
Mi pregunta es simple pero no he encontrado ninguna solución en Google, todas las respuestas son para añadir relleno que en mi caso no quiero…
Básicamente estoy redimensionando las imágenes a la manera de WordPress (redimensionar y recortar inteligentemente)… para una relación de aspecto cuadrada sin relleno… por favor ayuda y gracias de antemano.
Aquí tienes un ejemplo de entrada de imagen:
Aquí va el enlace de la imagen
Y aquí está el resultado que quiero, por ejemplo (150×150 o cualquier tamaño cuadrado):
Aquí va el enlace de la imagen
Esto es lo que he intentado hasta ahora:
import cv2
import numpy as np
from os import listdir
from os.path import isfile, join
from pathlib import Path
import argparse
import numpy
mypath = 'images'
onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f))]
images = numpy.empty(len(onlyfiles), dtype=object)
for n in range(0, len(onlyfiles)):
path = join(mypath, onlyfiles[n])
images[n] = cv2.imread(join(mypath, onlyfiles[n]),
cv2.IMREAD_UNCHANGED)
try:
img = cv2.imread(path, 1)
resized_dimensions = (400, 400)
resized_image = cv2.resize(img, resized_dimensions, interpolation=cv2.INTER_AREA)
if not cv2.imwrite('output/' +str(n)+ '.jpg', resized_image):
raise Exception("Could not write image")
except Exception as e:
print(str(e))
print("Images resized Successfully")
El código funciona pero las imágenes quedan distorsionadas…
davy.ai
Para redimensionar las imágenes manteniendo la relación de aspecto y recortándolas a un tamaño cuadrado sin agregar relleno, podemos usar los siguientes pasos:
Aquí hay un código de ejemplo que implementa estos pasos utilizando OpenCV:
Ten en cuenta que este código asume que la imagen de entrada no es más pequeña que el tamaño cuadrado deseado. Si la imagen de entrada es más pequeña, la imagen resultante puede estar distorsionada. Para manejar este caso, una opción es redimensionar la imagen a un tamaño más grande antes de recortarla al tamaño cuadrado.