[Python] Convertir la résolution de l'image pour la redimensionner, sans changer le rapport d'aspect, sans perdre les informations de l'image, OpenCV, vision par ordinateur

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)

Tout d'abord, la hauteur et la largeur par défaut de l'image sont définies. Ensuite, la fonction de redimensionnement et de sauvegarde de l'image est réalisée via la fonction resize_and_save. La fonction reçoit un chemin de dossier d'image d'entrée et un chemin de dossier d'image de sortie, ainsi que des paramètres de hauteur et de largeur facultatifs.

Dans la fonction, déterminez d'abord si le dossier d'image de sortie existe et créez-le s'il n'existe pas. Ensuite, récupérez tous les noms de fichiers d'image se terminant par '.jpg' dans le dossier d'image d'entrée et créez une liste de chemins de fichiers d'image. Renvoie 0 si aucun fichier image correspondant n'est trouvé.

Ensuite, parcourez la liste des chemins de fichiers image, en traitant chaque image à tour de rôle. Lire un fichier image et obtenir la hauteur, la largeur et le nombre de canaux de l'image. Ensuite, le taux de redimensionnement est calculé en fonction du côté long de l'image par rapport à la hauteur et à la largeur spécifiées.

Ensuite, utilisez la fonction de redimensionnement d'OpenCV pour redimensionner l'image proportionnellement. En fonction de la relation entre l'image ajustée et la hauteur et la largeur cibles, calculez la taille de la bordure à ajouter.

Définissez la valeur en pixels de la bordure noire et utilisez la fonction copyMakeBorder d'OpenCV pour ajouter des bordures noires en haut, en bas, à gauche et à droite de l'image.

Enfin, utilisez la fonction imwrite d'OpenCV pour enregistrer l'image ajustée dans le dossier d'image de sortie et imprimez les informations de forme de l'image avant et après l'ajustement.

Dans la fonction principale, les chemins du dossier d'image d'entrée et du dossier d'image de sortie sont spécifiés, et la fonction resize_and_save est appelée pour redimensionner et enregistrer l'image.

L'effet est le suivant

Convertir une image 5140*5140 en image 640*480

Je suppose que tu aimes

Origine blog.csdn.net/dsafefvf/article/details/130644800
conseillé
Classement