图片批量重命名、批量按像素分割和批量resize

图片批量重命名、批量按像素分割和批量resize

图片批量重命名

具体代码如下所示:

# 图片批量重命名
# 重命名一个文件夹中所有的图片
import os

path_name = os.path.join(os.getcwd(), 'myimages')
'''
 获取图片所在文件夹的地址
 可修改为文件的相对路径,比如: 
 path_name = D:\Documents\GitHub\my_OpenCV\models-master\research\my_data\myimages)
'''
num = 0 # 图片命名的序号(从num开始)

for item in os.listdir(path_name):#进入到文件夹内,对每个文件进行循环遍历
    re_name = str(num)+'.jpg' # 重命名图片文件的格式(从num开始)
    os.rename(os.path.join(path_name,item),os.path.join(path_name,re_name))
    num+=1

图片分割(按指定像素网格化分割)

分割方式如下图所示:


分割后的图片的名字为:

其中14_0_0 的意思为:原图变换为第14的图片按网格切割出的第一列第一行的小图
其中14_0_1 的意思为:原图变换为第14的图片按网格切割出的第一列第二行的小图
其中14_0_2 的意思为:原图变换为第14的图片按网格切割出的第一列第三行的小图

分割后的图片与原图片在同一文件夹:

具体代码和调用方式如下:

调用函数image_cut时,可修改box_w或box_h值改变切割出的图片大小:

from PIL import Image
import os

def image_cut(path_name,id,box_w=600,box_h=600):
    '''
    path_name:要剪切的图像的文件夹(路径)
    id:图像的命名序号(按我提供的重命名方式命名的序号,参考:图片批量重命名)
    box_w:要剪切的图形的宽度,默认为600像素
    box_h:要剪切的图形的高度,默认为600像素
    '''
    name = os.path.join(path_name,str(id) + ".jpg") #要剪切图像的名字
    im = Image.open(name)
    # im_size = im.size # 像素大小
    width = im.size[0]
    height = im.size[1]
    
    if width > box_w &( height > box_h):
        for i in range(int(width/box_w)):
            for j in range(int(height/box_h)):
                name_cut = os.path.join(path_name,'c_im'+str(id)+'_'+str(i)+'_'+str(j)+ ".jpg")
                cm = im.crop(box=(i*box_w,j*box_h,(i+1)*box_w,(j+1)*box_h))
                cm.save(name_cut) 
                if i+1 == int(width/box_w):
                    name_cut = os.path.join(path_name,'c_im'+str(id)+'_'+str(i+1)+'_'+str(j)+ ".jpg")
                    cm = im.crop(box=((i+1)*box_w,(j*box_h),width,(j+1)*box_h))
                    cm.save(name_cut) 
                if j+1 == int(height/box_h):
                    name_cut = os.path.join(path_name,'c_im'+str(id)+'_'+str(i)+'_'+str(j+1)+ ".jpg")
                    cm = im.crop(box=(i*box_w,(j+1)*box_h,(i+1)*box_w,height))
                    cm.save(name_cut) 
                if i+1 == int(width/box_w)&j+1 == int(height/box_h):
                    name_cut = os.path.join(path_name,'c_im'+str(id)+'_'+str(i+1)+'_'+str(j+1)+ ".jpg")
                    cm = im.crop(box=((i+1)*box_w,(j+1)*box_h,width,height))
                    cm.save(name_cut) 


# 调用方式1
# 只剪切一个图片
id = 1 # 图像的命名序号
path_name = os.path.join(os.getcwd(), 'myimages_cut') # 要剪切的图像的文件夹路径

image_cut(path_name,id,box_w=600,box_h=600)


# 调用方式2
# 批量剪切文件夹中所有图片大于 box_w*box_h 的图片

path_name = os.path.join(os.getcwd(), 'myimages_cut') # 要剪切的图像的文件夹路径

for item in os.listdir(path_name):
    id=item.split('.')[0]
    image_cut(path_name,id,box_w=600,box_h=600)

图片分割(按长宽的比例分割)

具体代码如下图

调用函数image_cut__por时,可修改fx或fy值改变切割出的图片比例大小:

具体代码如下:

from PIL import Image
import os

def image_cut_por(path_name,id,fx=0.5,fy=0.5):
    '''
    path_name:要剪切的图像的文件夹(路径)
    id:图像的命名序号(按我提供的重命名方式命名的序号,参考:图片批量重命名)
    fx:要剪切的图形的宽度比例,默认为0.5
    fy:要剪切的图形的高度比例,默认为0.5
    '''
    name = os.path.join(path_name,str(id) + ".jpg") #要剪切图像的名字
    im = Image.open(name)
    # im_size = im.size # 像素大小
    width = im.size[0]
    height = im.size[1]
    box_w = width * fx
    box_h = height * fy
    

    for i in range(int(width/box_w)):
        for j in range(int(height/box_h)):
            name_cut = os.path.join(path_name,'c_im'+str(id)+'_'+str(i)+'_'+str(j)+ ".jpg")
            cm = im.crop(box=(i*box_w,j*box_h,(i+1)*box_w,(j+1)*box_h))
            cm.save(name_cut) 


# 调用方式1
# 只剪切一个图片
# fx=0.5,fy=0.5是默认比例,即把图像均分成四分,像直角坐标的象限一样的分法

id = 0 # 图像的命名序号
path_name = os.path.join(os.getcwd(), 'bdz_image') # 要剪切的图像的文件夹路径
# 这样调用时,图像所在的文件夹(bdz_image)与程序在同一目录下
image_cut_por(path_name,id)


# 调用方式2
# 批量剪切文件夹中所有图片
# fx=0.5,fy=0.5是默认比例,即把图像均分成四分,像直角坐标的象限一样的分法

path_name = os.path.join(os.getcwd(), 'bdz_image') # 要剪切的图像的文件夹路径
# 这样调用时,图像所在的文件夹(bdz_image)与程序在同一目录下

for item in os.listdir(path_name):
    id=item.split('.')[0]
    image_cut_por(path_name,id,fx=0.5,fy=0.5)

批量resize

具体代码如下:

## Bulk image resizer
# 批量resize
import numpy as np
import cv2
import os

dir_path = os.path.join(os.getcwd(), 'cut_4image') #要处理的的图像所在的文件夹,也可以是绝对路径
# 这样调用时,图像所在的文件夹(bdz_image)与程序在同一目录下

for filename in os.listdir(dir_path):
    # If the images are not .JPG images, change the line below to match the image type.
    if filename.endswith(".jpg"):
        name = os.path.join(dir_path,filename) #要resize的图像的名字
        image = cv2.imread(name)
        resized = cv2.resize(image,None,fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA)
        re_dir_path = os.path.join(os.getcwd(), 'cut_4image_resize', filename)# 存储resize后的文件夹,也可以是绝对路径
        cv2.imwrite(re_dir_path,resized)

编辑于 2018-07-21

文章被以下专栏收录