在训练YOLOv5的时候,想着将每张图片中的特征图片进行剪切出来,于是有了下面代码:
1、准备数据和图片先简单说一下图片的布局,如图:
所以txt文件如下:
“10 7 1835 1920 2134 2380
10 228 3040 618 3563 1037“
这个第一位数没意义,占位置,第二位是虫子的种类,剩下依次是左上角x坐标,左上角y坐标,右下角x坐标,右下角y坐标
如下是图片:
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循环,将每一张图片中需要剪切的图片给剪切出来。
部分代码参考网上
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)