es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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…

Tags:  , , ,

Answer

  1. Avatar for 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:

    1. Calcular el ancho y alto de la imagen.
    2. Encontrar el valor mínimo del paso 1 y utilizarlo como longitud de lado del cuadrado.
    3. Recortar la imagen al tamaño cuadrado.
    4. Redimensionar la imagen cuadrada al tamaño deseado.

    Aquí hay un código de ejemplo que implementa estos pasos utilizando OpenCV:

    import cv2
    
    def resize_and_crop(image, size):
        # obtener dimensiones de la imagen
        height, width = image.shape[:2]
        # encontrar el tamaño mínimo
        min_size = min(width, height)
        # recortar al cuadrado
        center_x, center_y = width // 2, height // 2
        half_size = min_size // 2
        x1, y1 = center_x - half_size, center_y - half_size
        x2, y2 = center_x + half_size, center_y + half_size
        cropped = image[y1:y2, x1:x2]
        # redimensionar al tamaño deseado
        resized = cv2.resize(cropped, size, interpolation=cv2.INTER_AREA)
        return resized
    
    # uso de ejemplo
    image = cv2.imread("ruta/imagen.jpg")
    resized = resize_and_crop(image, (150, 150))
    cv2.imshow("Imagen Redimensionada", resized)
    cv2.waitKey(0)
    

    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.

Comments are closed.