Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menggunakan Python untuk mengubah suai saiz imej dalam kelompok dan menyatukan saiz?

Bagaimana untuk menggunakan Python untuk mengubah suai saiz imej dalam kelompok dan menyatukan saiz?

WBOY
WBOYke hadapan
2023-04-22 14:07:082354semak imbas

    Batch menukar saiz imej kepada saiz seragam

    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")

    Mata pengetahuan

    Pustaka imej PIL (Python Image Library) ialah versi ketiga python Ia adalah perpustakaan pemprosesan imej pihak ketiga, tetapi disebabkan fungsinya yang berkuasa dan bilangan pengguna yang ramai, ia hampir dianggap sebagai perpustakaan pemprosesan imej rasmi ular sawa.

    Kelas Imej ialah kelas teras dalam PIL Anda mempunyai banyak cara untuk memulakannya, seperti memuatkan imej daripada fail, memproses bentuk imej lain atau mencipta imej dari awal.

    Kaedah asas operasi modul Imej disertakan dalam modul ini. Seperti buka, simpan, tukar, tunjukkan... dan kaedah lain.

    1. Untuk memuatkan imej, gunakan fungsi open() kelas Imej:

    Image.open(jpgfile)

    2 fungsi save() bagi kelas Imej Fungsi:

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

    kaedah 3.os.path.basename():

    Mengembalikan fail terakhir nama laluan, jika laluan berakhir dengan ’/ ' pada penghujungnya, maka nilai nol akan dikembalikan, iaitu elemen kedua os.path.split(path).

    Contoh:

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

    4.img.resize((lebar,tinggi),Imej.BILINEAR):

    Nyatakan menggunakan ubah saiz fungsi Saiz dan kualiti imej, tetapan dan makna parameter kedua adalah seperti berikut:


    Bagaimana untuk menggunakan Python untuk mengubah suai saiz imej dalam kelompok dan menyatukan saiz?

    5.glob.glob() dan glob. iglob() Penggunaan:

    glob.glob() boleh memperoleh semua laluan padanan pada masa yang sama, manakala glob.iglob() hanya boleh memperoleh satu laluan padanan pada satu masa.

    Skala imej dan teg xml dengan saiz yang berbeza kepada saiz yang sama, dan namakan semula storan

    Kongsi fungsi yang lebih praktikal, cuma tukar laluan fail dan saiz zum untuk menyesuaikannya dengan anda sendiri.

    Berlaku untuk gambar yang pada asalnya berbeza saiz dan tidak boleh diskalakan secara seragam. Ia hanya boleh diletakkan di atas kanvas bersaiz seragam.

    Jika saiz imej asal adalah sama, sila rujuk blog saya yang lain untuk mencarinya sendiri.

    Persekitaran operasi: python3.5+

    Anda perlu memasang opencv Jika anda mempunyai anaconda, laksanakan conda 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)             # 存储按新文件名命令的图片

    Keperluan baharu akan datang kemudian. seorang Pengaturcara, keperluan mesti sentiasa dipenuhi. Semasa penskalaan, adalah perlu untuk mengekalkan perkadaran asal, dan menetapkan segala-galanya kepada kanvas hitam sepenuhnya 800 * 800, yang merupakan operasi isian sifar dan melaraskan semula kod bahagian teras adalah untuk menentukan sama ada sisi panjang imej adalah lebih besar daripada 800 dan lebih besar daripada Jika ia adalah 800, nisbah 800 kepada sisi panjang akan ditetapkan sebagai nisbah skala Jika kurang daripada 800, saiz imej asal akan kekal tidak berubah. Numpy perpustakaan baharu perlu diimport, conda install numpy: Fail xml yang ditandakan dengan

    # *_* 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)            # 存储按新文件名命令的图片

    perlu diubah suai serentak, jadi kod itu dilaraskan:

    # *_* 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)            # 存储按新文件名命令的图片

    Atas ialah kandungan terperinci Bagaimana untuk menggunakan Python untuk mengubah suai saiz imej dalam kelompok dan menyatukan saiz?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Kenyataan:
    Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam