ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

批量处理图片(resize;grayscale)以及重命名

2020-10-30 10:35:38  阅读:252  来源: 互联网

标签:重命名 cv2 grayscale item path array os resize


批量处理图片(resize;grayscale)以及重命名

  做深度学习,有大量图片需要做为训练集,为方便批量resize,rename,灰度化,制作python脚本。

先纪录一些函数:

resize

def resizeimage(readpath,savepath,width,height):
    try:
        '''调用cv2.imread读入图片,读入格式为IMREAD_COLOR'''
        '''使用os.path模块的join方法生成路径'''
        img_array = cv2.imread(os.path.join(readpath, item), cv2.IMREAD_COLOR)
        '''调用cv2.resize函数resize图片'''
        new_array = cv2.resize(img_array, (width, height))       # 缩小像素
        
        # img_name = str(item) + '.jpg'
        '''生成图片存储的目标路径'''
        save_path = os.path.join(savepath, item)

        '''调用cv.2的imwrite函数保存图片'''
        cv2.imwrite(save_path, new_array)
    except Exception as e:
        print(e)
readpath在程序中我采用的相对路径

savepath采用绝对路径,利用os.path.abspath()函数,os.path.abspath(__file__) 作用: 获取完整绝对路径

grayscale

# new_array = cv2.cvtColor(new_array, cv2.COLOR_RGB2GRAY)  # 把输入图像灰度化

在resize中可以多加一行就可以

重命名

在这里纪录完整代码,利用多层循环读取多层文件夹,os.rename(src, dst)函数实现重命名和保存,src, dst最好是完整绝对路径。

import os
import cv2import os.path# 图片输入路径
path = 'train'
# 图片输出路径,用来存储修改名字后图片的位置,当然你也可以覆盖在path中
outpath = 'out_train'


trainlist = os.listdir(path)  # 列举第一层文件夹



def resizeimage(readpath,savepath,width,height):
    try:
        '''调用cv2.imread读入图片,读入格式为IMREAD_COLOR'''
        '''使用os.path模块的join方法生成路径'''
        img_array = cv2.imread(os.path.join(readpath, item), cv2.IMREAD_COLOR)
        '''调用cv2.resize函数resize图片'''
        new_array = cv2.resize(img_array, (width, height))       # 缩小像素
        # new_array = cv2.cvtColor(new_array, cv2.COLOR_RGB2GRAY)  # 把输入图像灰度化
        # img_name = str(item) + '.jpg'
        '''生成图片存储的目标路径'''
        save_path = os.path.join(savepath, item)

        '''调用cv.2的imwrite函数保存图片'''
        cv2.imwrite(save_path, new_array)
    except Exception as e:
        print(e)


for m_folder in trainlist:
    m_path = os.path.join(path, m_folder)
    m_num_folder = len(trainlist)  # 第一层文件夹的总数
    print('m:total have %d folders' % (m_num_folder))  # 打印第一层文件夹的总数

    '''使用os.listdir(path)函数,返回path路径下所有文件的名字,以及文件夹的名字,'''
    mlist = os.listdir(m_path)  # 列举第二层文件

    for d_folder in mlist:
        d_path = os.path.join(m_path, d_folder)
        d_num_folder = len(mlist) # 第二层文件数目
        print('d:total have %d folders' % (d_num_folder))  # 打印第二层文件夹的总数
        print(d_path)
        imagelist = os.listdir(d_path)

        i = 0
        total_num_file = len(imagelist)  # 单个文件夹内文件的总数



        for item in imagelist:
            if item.endswith('.jpg'):

                ###### 图片修改 ######
                resizeimage(d_path,os.path.abspath(d_path),128,128)

                ###### 重命名并保存 ######
                # os.path.splitext将文件名拆分为名字和后缀名,可以打印出来看一下
                name = os.path.splitext(item)
                # 获取拆分后的第一个元素(文件名)“20140102_235528”
                img_segment = name[0]

                # 再拆分一次
                name_segment = img_segment.split("_")
                y_m_d = name_segment[0]  # 20140102
                h_M_S = name_segment[1]  # 235428

                h_M = h_M_S[0:4]

                # 获取拆分后的第二个元素(后缀名)
                four_segment = name[1]  # ".jpg"

                src = os.path.join(os.path.abspath(d_path), item)  # 原图的地址
                dst = os.path.join(os.path.abspath(d_path),
                                   y_m_d + "_" + h_M + four_segment)  # 新图的地址


                try:
                    os.rename(src, dst)
                    if i % 100 == 0:
                        print('converting %s to %s ...' % (src, dst))
                    i += 1
                except:
                    continue

        print('total %d to converted %d jpgs' % (total_num_file, i))

 

原图

 rename

resize

 

标签:重命名,cv2,grayscale,item,path,array,os,resize
来源: https://www.cnblogs.com/aimoboshu/p/13900815.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有