图片批处理|必备小技能
内容目录
图片批处理 简介具体事项1)分析文件的存储情况2)试着分析
代码实现输出结果:
结果展示
图片批处理 简介
图片批处理操作或者说数据的批处理在这个数据爆炸的时代经常会用到,除了特殊的情况,否则我们不会想着靠人力去一个一个的完成数据的处理(土法炼钢?),因此交给我们的苦力——电脑。
明确目标:把时间拿来做有价值的事情
思路:
1.批量读取文件
2.批量处理文件
3.批量存储文件
简称——3P操作?粗鄙之语。。。
具体事项
1)分析文件的存储情况
看一下文件的存储是什么鬼样子的

0文件夹下在3个小文件夹(比较常见的情况)


看完脑壳痛!
2)试着分析
说明:为了方便理解,我将文件夹命名的比较有规律,从0开始往下一级加1
(1)批量读取文件 转化为——三步走:
A)定位到第一级文件夹(0)位置
B)读取次级文件夹(1_1,1_2,1_3)名字
C)读取次级文件夹下的图片(或者数据)名字
好,现在很清晰了,是时候准备一些东西了
A)导入库
Os ——操作系统功能的接口
Tqdm ——加个进度条,方便装逼,不,是查看执行情况
cv2 ——对图片进行一些操作,读取存储和变化等

B)图片准备
这里在每个文件夹下放两张

(2)批量处理图片
这里你可以添加各种自己喜欢的扫操作,只要不违法,随便怎么搞,为了简单起见,我不搞花里胡哨的,在代码中用了灰度变化操作
(3)批量存储文件
理解了批量读取文件,实际上批量存储文件类似的
代码实现
'''
批量读取文件()
'''
import os
from tqdm import tqdm
'''
1.设置必要的读取路径和存储路径
'''
# path = os.getcwd() # 获取当前路径
# 处理的图片不是在当前文件下,可以直接添加绝对路径
path = '/media/pzw/0E50196C0E50196C/weixin/MultiProcess/0'
## print(path) # 习惯每步都确认一哈有没有出错,大家可以直接忽略
dst_path = '/media/pzw/0E50196C0E50196C/weixin/MultiProcess' # 处理完成后的图片存储位置
'''
2.进入次级文件夹并读取文件
'''
dir_names = os.listdir(path) # 读取次级文件夹名字
# print(dir_names)
for dir in tqdm(dir_names):
path_1 = os.path.join(path, dir) # 获取次级文件夹的路径 ||次级1开头
# print(path_1)
pic_names = os.listdir(path_1) #读取图片的名字
print(pic_names)
输出结果:
100%|██████████| 3/3 [00:00<00:00, 5863.43it/s]
['1_1_1.jpg', '1_1_2.jpg']
['1_2_1.jpg', '1_2_2.jpg']
['1_3_1.jpg', '1_3_2.jpg']
此时已经获取图片的名字和地址——可以开始干活了
接下的工作都是相当于对单张图片进行操作了,因为我们循环到最底层(可能表述的不是很准确,大概意思是找到图片了,想怎么搞怎么搞了现在)
代码给你们了,注释的很清楚了哈!!!
import osimport cv2from tqdm import tqdm'''1.设置必要的读取路径和存储路径'''# path = os.getcwd() # 获取当前路径# 处理的图片不是在当前文件下,可以直接添加绝对路径path = '/media/pzw/0E50196C0E50196C/weixin/MultiProcess/0' # 第一级文件夹 0 开头## print(path) # 习惯每步都确认一哈有没有出错,大家可以直接忽略dst_path0 = '/media/pzw/0E50196C0E50196C/weixin/MultiProcess/0_pro' # 处理完成后的图片存储位置'''2.进入次级文件夹并读取文件'''dir_names = os.listdir(path) # 读取次级文件夹名字# print(dir_names)# tqdm是为了显示当前读取到第n个文件夹了,当然可以换到其他位置,不了解的小伙伴看之前的文章哈for dir in tqdm(dir_names): path_1 = os.path.join(path, dir) # 获取次级文件夹的路径 ||次级1开头 # print(path_1) pic_names = os.listdir(path_1) #读取图片的名字 # print(pic_names) dst_path1 = os.path.join(dst_path0,dir) # 对应的次级存储路径 ''' 3.对图片进行操作 此时可以认为是在单独一个文件里面的操作,这个文件夹内操作完成之后, 便会执行下一个文件夹,这样子就很好理解怎么做 这段话放在这里可能会影响大家理解,但是是为了告诉大家思路哈。读代码的时候可以删了 ''' for pic_name in pic_names: new_path = os.path.join(path_1, pic_name) # print(new_path) # 图片的读取路径 dst_pic_name = pic_name.split('.')[0]+'>_<.jpg' # 对处理完的图片名字进行修改,比较被修理之后会哭的 # print(dst_pic_name) dst_path = os.path.join(dst_path1, dst_pic_name) # print(dst_path) # 读取图片 img_0 = cv2.imread(new_path, cv2.IMREAD_GRAYSCALE) # 变成灰度图 # 这里可以添加你们想要的操作,裁剪,变换等等 # 判断存储路径是否存在,不存在,创建新路径 isExists = os.path.exists(dst_path1) if not isExists: os.makedirs(dst_path1) cv2.imwrite(dst_path, img_0)
结果展示

文件夹名字、图片名字以及图片都变了,说明,我曹,老子居然成功运行了。。。。
为了方便大家获取代码,代码已经加入肯德基豪华套餐了。what?
不,已经放在github上面了
https://github.com/SCUTPZW/AI_study/tree/master

码编写不易,这些是我自己看了很多人代码,慢慢踩的坑,可能不是效率最高的,但是我希望这个思路能够对大家有所帮助,当然也欢迎大家提一哈建议,一起共同成长。