【图像处理】yolov5中利用PIL库批量将图片的某一块图片给裁剪下来

【图像处理】yolov5中利用PIL库批量将图片的某一块图片给裁剪下来,第1张

在训练YOLOv5的时候,想着将每张图片中的特征图片进行剪切出来,于是有了下面代码:

1、准备数据和图片

先简单说一下图片的布局,如图:

所以txt文件如下:
“10 7 1835 1920 2134 2380
10 228 3040 618 3563 1037“
这个第一位数没意义,占位置,第二位是虫子的种类,剩下依次是左上角x坐标,左上角y坐标,右下角x坐标,右下角y坐标
如下是图片:

2、代码:
import  os
from PIL import Image

def getFileList(dir,fileList,ext=None):
    """
    读取图像的每一个文件的路径
    dir:根目录
    ext:扩展名
    """
    newDir=dir
    if os.path.isfile(dir):
        if ext is None:
            fileList.append(dir)
        else:
            if ext in dir[-3:]:
                fileList.append(dir)

    elif os.path.isdir(dir):
        for s in os.listdir(dir):
            newDir=os.path.join(dir,s)
            getFileList(newDir,fileList,ext)

    return fileList


path='/root/dataBulid/image'       #图像的路径
imglist=getFileList(path,[],'jpg')
print("本次检索到"+str(len(imglist))+'张图像\n')

imputPath="/root/dataBulid/images/mii"   #标注的路径
num=os.listdir(imputPath)
print("本次检索到"+str(len(num))+'个标注\n')

for i in range(2,576):  #前两个图片因为图片和txt的排序没有一一对应,手动裁剪
    f1=open(os.path.join(imputPath,num[i]),"rb")
    num1=int(len(f1.readlines()))             #需要提前读取到txt文档里面有多少行,保存为列表类型
    f1.close()                                  #记得关闭文档,避免下面写入的时候从当前开始
    with open(os.path.join(imputPath, num[i]), "rb") as f:
        # num1=int(len(f.readlines()))
        for j in range(1, num1 + 1):
            # print(i)
            line = f.readlines(j)
            lines = str(line)
            # print(int(lines.split(',')[0]))
            print(int(lines.split(',')[1]))
            x1=int(lines.split(',')[1])            

            print(int(lines.split(',')[2]))
            x2=int(lines.split(',')[2])

            print(int(lines.split(',')[3]))
            x3=int(lines.split(',')[3])

            print(int(lines.split(',')[4]))
            x4 = int(lines.split(',')[4])

            print(int(lines.split(',')[5]))
            x5 = int(lines.split(',')[5])

            #savePath="/root/dataBulid/da/{}.jpg".format(x1+"_")
            savePath = "/root/dataBulid/ad2/{}_{}_{}.jpg".format(x1,i,j)    #命名方式
            image=Image.open(imglist[i])
            crop1=(x2,x3,x4,x5)            #将图片中要截取的地方给剪切了
            img=image.crop(crop1)
            img.save(savePath)
            print(i)
3、剪切效果:



要点就是图片和txt的数量一一对应,然后利用for循环,将每一张图片中需要剪切的图片给剪切出来。
部分代码参考网上

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/790324.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-05
下一篇 2022-05-05

发表评论

登录后才能评论

评论列表(0条)

保存