python用PIL库批量裁剪指定大小的图像(自动填充裁剪不完的部分)

概述

主要功能:使用python代码裁剪批量图片
网上用python裁剪图片的代码有很多,但是往往没有考虑到图片裁剪不完的情况。举个例子,我有4096 * 1800的图片,想把它批量裁剪成1024 * 1024的图片,在宽度上刚好是4096/1024=4份,但在高度上1800/1024不能整除,为了保证图片的完整信息,这里我们只能进位,在高度上裁剪1800/1024 +1 =2份,因此一共裁剪成4 * 2 = 8张。
为了自己输入图像的方便就自己写了裁剪图像的代码,可以根据需求自己设置裁剪图像的大小,默认是裁剪出的图像宽高一致。

代码: crop.py

import os
from PIL import Image

#用PIL库批量裁剪指定大小的图像(自动填充)
def img_crop(img_path, save_path):
    files = os.listdir(img_path)
    for file in files:
        a, b = os.path.splitext(file)
        img = Image.open(os.path.join(img_path + "/" + file))
        width, hight = img.size
        w = 1024  # 需要切成图片块的大小,默认大小为w*w,可以自己设置
        id = 1
        i = 0
        padw = padh = 0  # 当宽高除不尽切块大小时,对最后一块进行填充
        if width % w != 0:
            padw = 1  # 宽除不尽的情况
        if hight % w != 0:
            padh = 1  # 高除不尽的情况

        # 默认从最左上角向右裁剪,再向下裁剪
        while i + w <= hight:
            j = 0
            while j + w <= width:
                new_img = img.crop((j, i, j + w, i + w))
                new_img.save(save_path + a + "_" + str(id) + b)
                id += 1
                j += w
            if padw == 1:  # 宽有除不尽的情况
                new_img = img.crop((width - w, i, width, i + w))
                new_img.save(save_path + a + "_" + str(id) + b)
                id += 1
            i = i + w

        if padh == 1:  # 高除不尽的情况
            j = 0
            while j + w <= width:
                new_img = img.crop((j, hight - w, j + w, hight))
                new_img.save(save_path + a + "_" + str(id) + b)
                id += 1
                j += w
            if padw == 1:
                new_img = img.crop((width - w, hight - w, width, hight))
                new_img.save(save_path + a + "_" + str(id) + b)
                id += 1


if __name__ == '__main__':
    # img_path:输入图像的路径
    img_path = '/home/xiaopeng/pythonProject/change_detection.pytorch/dataset/match2/test/'
    # save_path:图像保存的位置
    save_path = '/home/xiaopeng/pythonProject/change_detection.pytorch/dataset/match2/test_crop/'
    img_crop(img_path, save_path)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值