通过输入xy的最大值和最小值,运用for循环并通过修改图片名来避免保存图片时的覆盖现象,达到实现切割出一张图中想要部分的目的
之前实现了单个框的切割(可见博文:https://blog.csdn.net/m0_54065225/article/details/115333426?spm=1001.2014.3001.5501)
现在“贪心”想一次性切割出一张图中所有的框改怎么办呢?Now let me show u the answer:
First and foremost,给大家看看保存坐标的txt文件的样子:
这里的数据分别是:框左上角x坐标,左上角y坐标,框宽l,框高h
Secondly,废话少说直接上代码(注释已经说的很明白了哦)
# -*- coding: utf-8 -*-
"""
Created on Mon Apr 5 22:47:44 2021
@author: Alan
"""
import os
import cv2
import numpy as np
# 遍历指定目录,显示目录下的所有文件名(文件路径在代码最后)
def CropImage4File(filepath,destpath):
pathDir = os.listdir(filepath) # 列出文件路径中的所有路径或文件
i = 0
with open('D:/Spyder_result/data.txt','r') as f:
data = f.readlines() #将txt中所有字符串读入data
for line in data:
i = i+1 #通过每次循环增加i的值来达到后面改名的目的
numbers = line.split() #分隔数据
numbers_float = list(map(float, numbers)) #将字符串转化为浮点数
numbers_int = np.array(numbers_float, dtype=np.int) #将浮点数数组转换为整型数组
print(numbers_int) #显示出数组
for allDir in pathDir:
child = os.path.join(filepath, allDir) #拼接路径
dest = os.path.join(destpath,allDir) #因为要改输出的文件名,这里的输出路径没用上
if os.path.isfile(child):
image = cv2.imread(child)
x=numbers_int[0]
y=numbers_int[1]
l=numbers_int[2]
h=numbers_int[3] #因为txt中放入的不是xy的最小最大值,所以下面进行了一个转换
a=y # ymin
b=y+h # ymax
c=x # xmin
d=x+l # xmax
cropImg = image[a:b,c:d] #裁剪图像
filename = [50] #建立一个50行的数组,储存数据
filename = 'D:/cut/{i}.jpg'.format_map(vars()) #为避免每次循环图片覆盖,每个循环输出的图片我们对其进行改名
cv2.imwrite(filename,cropImg) # 把切出来的图像写在目标路径中
if __name__ == '__main__':
filepath ='D:/cori/' # source images
destpath='D:/cut/' # resized images saved here
CropImage4File('D:/cori/','D:/cut/')
Additionally,给大家看看效果图吧
效果图就不发了哦,希望大家觉得上面的代码有用噢~
Last but not least,大家觉得有帮助的话点个赞哦~
(接下来的话是我自己的记录,不喜勿喷鸭)
日常用喜欢的句子结尾:脚踏实地,然后,仰望星空。
希望自己能在以后的生活中多一份踏实,做好现在的每一件事情,一步一个脚印积累起来!
(想起来了为了高考而沉下心来刷的无数道题,以前的刷题又何尝不是现在甚至以后学习的方法呢,不过高中的时候可没想这么多,现在是真的越来越发现生活中的一切都有科学的因素哈哈哈,正所谓——相信科学)