Maison >développement back-end >Tutoriel Python >Comment utiliser Python pour modifier la taille de l'image par lots et unifier la taille ?

Comment utiliser Python pour modifier la taille de l'image par lots et unifier la taille ?

WBOY
WBOYavant
2023-04-22 14:07:082430parcourir

    Changement par lots de la taille de l'image en taille uniforme

    import os
    from PIL import Image
    import glob
    def convertjpg(jpgfile,outdir,width=200,height=500):
        img=Image.open(jpgfile)
        new_img=img.resize((width,height),Image.BILINEAR)   
        new_img.save(os.path.join(outdir,os.path.basename(jpgfile)))
    
    for jpgfile in glob.glob(('/home/yangguide/Videos/images/*.png')):
        convertjpg(jpgfile,"/home/yangguide/Videos/image_2")

    Points de connaissance

    Bibliothèque d'images PIL (Python Image Library) est une bibliothèque de traitement d'image tierce pour Python, mais en raison de ses fonctions puissantes et de son grand nombre d'utilisateurs, ça l'a presque été, je pense que c'est la bibliothèque officielle de traitement d'images de Python.

    La classe Image est la classe principale de PIL. Vous disposez de plusieurs façons de l'initialiser, comme charger une image à partir d'un fichier, traiter d'autres formes d'images ou créer une image à partir de zéro.

    Les méthodes de base de fonctionnement du module Image sont incluses dans ce module. Comme ouvrir, enregistrer, convertir, afficher... et d'autres méthodes.

    1. Pour charger l'image, utilisez la fonction open() de la classe Image :

    Image.open(jpgfile)

    2. Pour enregistrer l'image, utilisez la fonction save() de la classe Image :

    new_img.save(os.path.join(outdir,os.path.basename(jpgfile)))

    3. Méthode .os.path.basename() :

    Renvoie le dernier nom de fichier du chemin. Si le chemin se termine par ’/', alors une valeur nulle sera renvoyée, qui est le deuxième élément de os.path.split( chemin).

    Exemple :

    >>> import os
    >>> path = '/Users/beazley/Data/data.csv'
    >>> os.path.basename(path) #Get the last component of the path
    'data.csv'

    4.img.resize((width,height),Image.BILINEAR) :

    Utilisez la fonction de redimensionnement pour spécifier la taille et la qualité de l'image. Le deuxième paramètre et sa signification sont les suivants. suit :


    Comment utiliser Python pour modifier la taille de limage par lots et unifier la taille ?

    5. Utilisation de glob.glob() et glob.iglob() :

    glob.glob() peut obtenir tous les chemins correspondants en même temps, tandis que glob.iglob() peut le faire. n'obtenez qu'un seul chemin correspondant à la fois.

    Redimensionnez les images et les balises XML de différentes tailles à la même taille, puis renommez-les et stockez-les

    Partageant une fonction plus pratique, vous pouvez l'adapter à la vôtre en modifiant le chemin du fichier et en mettant à l'échelle la taille.

    Applicable aux images qui sont à l'origine de tailles différentes et ne peuvent pas être mises à l'échelle uniformément. Elles ne peuvent être placées que sur une toile de taille uniforme.

    Si les tailles d'image originales sont les mêmes, veuillez vous référer à mon autre blog pour le trouver vous-même.

    Environnement d'exécution : python3.5+

    Vous devez installer opencv. Si vous avez anaconda, exécutez conda install opencv-pythonconda install opencv-python

    # *_* coding : UTF-8 *_*
    # 开发人员   :csu·pan-_-||
    # 开发时间   :2020/11/09 16:40
    # 文件名称   :renameFile.py
    # 开发工具   :PyCharm
    # 功能描述   :将文件夹下的图片全部缩放,裁减,并按新文件名存储
    
    import os
    import cv2
    
    path = 'E:/Projects/images'        # 原文件夹路径
    newpath = 'E:/Projects/newimages'  # 新文件夹路径
    files = os.listdir(path)           # 获取文件名列表
    for i, file in enumerate(files):   # 展开文件名的列表和索引
        if file.endswith('.jpg'):
            imgName = os.path.join(path, file)      # 获取文件完整路径
            img = cv2.imread(imgName)                 # 读图
            imgNew = cv2.resize(img, (1200, 1200))  # 缩放
            # imgNew = imgNew[60:552,:]             # 截取一部分区域
            newName = os.path.join(newpath, 'img_%03d'%(0+i)+'.jpg')  # 设置新的文件名
            print(newName)
            cv2.imwrite(newName,imgNew)             # 存储按新文件名命令的图片

    后面来了新的需求,作为一个程序员,需求是永远要去满足的。缩放的同时,需要保持原有比例,全部设置到一张800 * 800的全黑画布上面,即补零操作,又重新调整了代码,其中的核心部分就是判断图像的长边是否大于800,大于800则将800与长边的比值设置为缩放比例,小于800则原图大小不变。需要导入一个新库numpy,conda install numpy

    # *_* coding : UTF-8 *_*
    # 开发人员   :csu·pan-_-||
    # 开发时间   :2020/11/09 18:15
    # 文件名称   :renameFile.py
    # 开发工具   :PyCharm
    # 功能描述   :将文件夹下的图片全部缩放(同时保持原有宽高比例),裁切,并按新文件名存储
    
    import os
    import cv2
    import numpy as np
    
    path = r'E:\Projects\images'          # 原文件夹路径
    newpath = r'E:\Projects\newimages'    # 新文件夹路径
    files = os.listdir(path)              # 获取文件名列表
    c_w ,c_h = 800,800                    # 全黑画布的大小
    
    for i, file in enumerate(files):
        img_zeros = np.zeros((c_w, c_h, 3), np.uint8) # 创建全黑的图像
        if file.endswith('.jpg'):
            imgName = os.path.join(path, file)        # 获取文件完整路径
            img = cv2.imread(imgName)                 # 读图
            h, w , _ = img.shape                      # 获取图像宽高
            # 缩放图像,宽高大于800的按长边等比例缩放,小于800的保持原图像大小:
            if max(w,h) > c_w:
                ratio = c_w / max(w,h)
                imgcrop = cv2.resize(img, (round(w * ratio) , round(h * ratio)))
                # 将裁切后的图像复制进全黑图像里
                img_zeros[0:round(h * ratio), 0:round(w * ratio)] = imgcrop
            else:
                img_zeros[0:h, 0:w] = img
            # imgNew = imgNew[60:552,:]               # 截取一部分
            # 设置新的文件名:
            newName = os.path.join(newpath, 'img_%03d'%(0+i)+'.jpg')
            print(newName)
            cv2.imwrite(newName,img_zeros)            # 存储按新文件名命令的图片

    Il y a de nouvelles exigences plus tard. En tant que programmeur, les exigences. Je veux toujours être satisfait. Lors de la mise à l'échelle, il est nécessaire de conserver les proportions d'origine et de tout définir sur une toile complètement noire de 800 * 800, ce qui est une opération de remplissage nul et de réajuster le code. La partie essentielle est de déterminer si le côté long de l'image est. supérieur à 800 et supérieur à S'il est égal à 800, le rapport de 800 au côté long sera défini comme rapport de mise à l'échelle. S'il est inférieur à 800, la taille de l'image originale restera inchangée. Une nouvelle bibliothèque numpy doit être importée, conda install numpy :

    # *_* coding : UTF-8 *_*
    # 开发人员   :csu·pan-_-||
    # 开发时间   :2020/11/09 18:15
    # 文件名称   :renameFile.py
    # 开发工具   :PyCharm
    # 功能描述   :将文件夹下的图片全部缩放(同时保持原有宽高比例),裁切,并按新文件名存储
    #             同时调整xml里的坐标信息
    
    import os
    import cv2
    import numpy as np
    import xml.etree.ElementTree as ET
    
    path = r'C:\Users\Administrator\Desktop\test'          # 原文件夹路径
    newpath = r'C:\Users\Administrator\Desktop\newtest'    # 新文件夹路径
    c_w ,c_h = 800,800                    # 全黑画布的大小
    
    def edit_xml(xml_file,ratio,i):
        """
        修改xml文件
        :param xml_file:xml文件的路径
        :return:
        """
        all_xml_file = os.path.join(path, xml_file)
        tree = ET.parse(all_xml_file)
        objs = tree.findall('object')
        for ix, obj in enumerate(objs):
            type = obj.find('type').text
            if type == 'bndbox':
                obj_bnd = obj.find('bndbox')
                obj_xmin = obj_bnd.find('xmin')
                obj_ymin = obj_bnd.find('ymin')
                obj_xmax = obj_bnd.find('xmax')
                obj_ymax = obj_bnd.find('ymax')
                xmin = float(obj_xmin.text)
                ymin = float(obj_ymin.text)
                xmax = float(obj_xmax.text)
                ymax = float(obj_ymax.text)
                obj_xmin.text = str(round(xmin * ratio))
                obj_ymin.text = str(round(ymin * ratio))
                obj_xmax.text = str(round(xmax * ratio))
                obj_ymax.text = str(round(ymax * ratio))
    
            elif type == 'robndbox':
                obj_bnd = obj.find('robndbox')
                obj_cx = obj_bnd.find('cx')
                obj_cy = obj_bnd.find('cy')
                obj_w = obj_bnd.find('w')
                obj_h = obj_bnd.find('h')
                obj_angle = obj_bnd.find('angle')
                cx = float(obj_cx.text)
                cy = float(obj_cy.text)
                w = float(obj_w.text)
                h = float(obj_h.text)
                obj_cx.text = str(cx * ratio)
                obj_cy.text = str(cy * ratio)
                obj_w.text = str(w * ratio)
                obj_h.text = str(h * ratio)
    
        newfile = os.path.join(newpath, '%05d'%(0+i)+'.xml')
        tree.write(newfile, method='xml', encoding='utf-8')  # 更新xml文件
    
    if __name__ == '__main__':
        files = os.listdir(path)              # 获取文件名列表
        for i, file in enumerate(files):
            img_zeros = np.zeros((c_w, c_h, 3), np.uint8)  # 创建全黑的图像
            if file.endswith('.jpg'):
                imgName = os.path.join(path, file)         # 获取文件完整路径
                xml_file = file.replace('.jpg','.xml')
                img = cv2.imread(imgName)                  # 读图
                h, w , _ = img.shape                       # 获取图像宽高
                # 缩放图像,宽高大于800的按长边等比例缩放,小于800的保持原图像大小:
                if max(w,h) > c_w:
                    ratio = c_w / max(w,h)
                    imgcrop = cv2.resize(img, (round(w * ratio) , round(h * ratio)))
                    # 将裁切后的图像复制进全黑图像里
                    img_zeros[0:round(h * ratio), 0:round(w * ratio)] = imgcrop
                    edit_xml(xml_file, ratio, i)
                else:
                    img_zeros[0:h, 0:w] = img
                    edit_xml(xml_file, 1, i)
    
                # 设置新的文件名:
                newName = os.path.join(newpath, '%05d'%(0+i)+'.jpg')
                print(newName)
                cv2.imwrite(newName,img_zeros)            # 存储按新文件名命令的图片

    Le fichier xml marqué doit être modifié simultanément, donc le code est ajusté :

    🎜rrreee

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Déclaration:
    Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer