[Python] Convierta la resolución de la imagen para cambiar el tamaño, sin cambiar la relación de aspecto, sin perder información de la imagen, OpenCV, visión por computadora

import os
import cv2
from tqdm import tqdm

# 设定默认图像高度和宽度
height = 640
width = 480


# 定义调整图像大小并保存的函数
def resize_and_save(srcImgDir, dstImgDir, height=height, width=width):
    # 如果目标图像文件夹不存在,则创建它
    if not os.path.exists(dstImgDir):
        os.makedirs(dstImgDir)

    # 获取源图像文件夹中以'.jpg'结尾的图像文件名列表
    imgNames = [img for img in os.listdir(srcImgDir) if img[-4:] == '.jpg']

    # 如果找到图像文件,则创建图像文件路径列表
    if imgNames:
        imgsList = [os.path.join(srcImgDir, i) for i in imgNames]
    else:
        return 0

    # 遍历图像文件路径列表
    for i, imgPath in tqdm(enumerate(imgsList)):
        # 获取输出图像文件的完整路径
        dstName = os.path.join(dstImgDir, imgNames[i])

        # 读取图像文件
        image = cv2.imread(imgPath)

        # 获取图像的高度、宽度和通道数
        h, w, c = image.shape

        # 初始化上、下、左、右的边框大小
        top, bottom, left, right = (0, 0, 0, 0)

        # 断言图像的高度和宽度大于等于指定的高度和宽度
        assert h >= height and w >= width, 'ratio should be less than 1'

        # 计算图像长边的缩放比例
        long_side = max(h, w)
        if h >= w:
            ratio = float(height) / long_side
        elif h < w:
            ratio = float(width) / long_side

        # 调整图像的长边并在短边两侧添加黑色边框
        resi = cv2.resize(image, (0, 0), fx=ratio, fy=ratio, interpolation=cv2.INTER_NEAREST)

        # 获取调整后的图像的高度、宽度和通道数
        res_height, res_width, res_c = resi.shape

        # 根据图像的长边与短边的关系,计算边框大小
        if h >= w:
            if res_width < width:
                dw = width - res_width
                left = dw // 2
                right = dw - left

        elif h < w:
            if res_height < height:
                dh = height - res_height
                top = dh // 2
                bottom = dh - top

        # 定义黑色边框的像素值
        BLACK = [0, 0, 0]

        # 在图像上下左右添加黑色边框
        res = cv2.copyMakeBorder(resi, top, bottom, left, right, cv2.BORDER_CONSTANT, value=BLACK)

        # 将调整后的图像保存到输出路径
        cv2.imwrite(dstName, res)

        # 打印图像调整前后的形状信息
        print(image.shape, '->', resi.shape, '->', res.shape)

    if __name__ == '__main__':
        # 指定输入图像文件夹和输出图像文件夹
        imgDir1 = 'input'
        imgDir2 = 'output'

        # 调用图像大小调整函数
        resize_and_save(imgDir1, imgDir2)

Primero, se definen la altura y el ancho predeterminados de la imagen. Luego, la función de cambiar el tamaño y guardar la imagen se realiza a través de la función resize_and_save. La función recibe una ruta de carpeta de imagen de entrada y una ruta de carpeta de imagen de salida, y parámetros opcionales de alto y ancho.

Dentro de la función, primero determine si la carpeta de imágenes de salida existe y créela si no existe. Luego, obtenga todos los nombres de archivos de imágenes que terminen en '.jpg' en la carpeta de imágenes de entrada y cree una lista de rutas de archivos de imágenes. Devuelve 0 si no se encuentra ningún archivo de imagen coincidente.

A continuación, recorra la lista de rutas de archivos de imagen, procesando cada imagen por turno. Lea un archivo de imagen y obtenga la altura, el ancho y el número de canales de la imagen. Luego, la relación de cambio de tamaño se calcula en función del lado largo de la imagen en comparación con la altura y el ancho especificados.

A continuación, utilice la función de cambio de tamaño de OpenCV para cambiar el tamaño de la imagen proporcionalmente. En función de la relación entre la imagen ajustada y la altura y el ancho objetivo, calcule el tamaño del borde que debe agregarse.

Defina el valor de píxel del borde negro y use la función copyMakeBorder de OpenCV para agregar bordes negros en la parte superior, inferior, izquierda y derecha de la imagen.

Finalmente, use la función imwrite de OpenCV para guardar la imagen ajustada en la carpeta de imágenes de salida e imprima la información de la forma de la imagen antes y después del ajuste.

En la función principal, se especifican las rutas de la carpeta de imágenes de entrada y la carpeta de imágenes de salida, y se llama a la función resize_and_save para cambiar el tamaño y guardar la imagen.

El efecto es el siguiente

Convierte una imagen de 5140*5140 a una imagen de 640*480

Supongo que te gusta

Origin blog.csdn.net/dsafefvf/article/details/130644800
Recomendado
Clasificación