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