You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

89 lines
3.4 KiB
Python

8 months ago
import os
from PIL import Image
import glob
def crop_images_in_folder(input_folder, output_folder, first_image_top=0.50, first_image_bottom=0.92,
other_images_top=0.08, other_images_bottom=0.92):
"""
裁剪输入文件夹中的图片
- 第一张图片裁剪掉上35%和下8%
- 其他图片裁剪掉上8%和下8%
并将裁剪后的图片保存到输出文件夹中
:param input_folder: 输入文件夹路径包含要裁剪的图片
:param output_folder: 输出文件夹路径用于保存裁剪后的图片
:param first_image_top: 第一张图片上边裁剪百分比0到1之间的值
:param first_image_bottom: 第一张图片下边裁剪百分比0到1之间的值
:param other_images_top: 其他图片上边裁剪百分比0到1之间的值
:param other_images_bottom: 其他图片下边裁剪百分比0到1之间的值
"""
# 确保输出文件夹存在
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# 获取输入文件夹中的所有图片文件
image_files = glob.glob(os.path.join(input_folder, '*'))
image_files.sort() # 按文件名排序,确保顺序一致
for i, image_file in enumerate(image_files):
try:
# 打开图片
image = Image.open(image_file)
# 获取图片的宽度和高度
width, height = image.size
# 定义裁剪区域
if i == 0:
# 第一张图片的裁剪比例
top_crop = int(height * first_image_top)
bottom_crop = int(height * first_image_bottom)
else:
# 其他图片的裁剪比例
top_crop = int(height * other_images_top)
bottom_crop = int(height * other_images_bottom)
# 裁剪图片
cropped_image = image.crop((0, top_crop, width, bottom_crop))
# 构建保存路径
file_name = os.path.basename(image_file)
output_file = os.path.join(output_folder, file_name)
# 保存裁剪后的图片
cropped_image.save(output_file)
# 如果你想查看裁剪后的图片,可以取消下面的注释
# cropped_image.show()
print(f'Processed and saved: {output_file}')
except Exception as e:
print(f'Error processing file {image_file}: {e}')
def process_all_folders(base_input_folder, base_output_folder):
"""
对基础输入文件夹下的每个子文件夹中的图片进行裁剪处理并将结果保存到对应的输出文件夹中
:param base_input_folder: 基础输入文件夹路径包含子文件夹
:param base_output_folder: 基础输出文件夹路径用于保存裁剪后的图片
"""
# 获取基础输入文件夹中的所有子文件夹
subfolders = [f.path for f in os.scandir(base_input_folder) if f.is_dir()]
for subfolder in subfolders:
# 构建对应的输出子文件夹路径
folder_name = os.path.basename(subfolder)
output_folder = os.path.join(base_output_folder, folder_name)
# 执行裁剪操作
crop_images_in_folder(subfolder, output_folder)
# 使用示例
base_input_folder = r'E:\Project\PaddleOCR\bilu_txt_dispose\bilu_img_2'
base_output_folder = r'E:\Project\PaddleOCR\bilu_txt_dispose\Crop_img'
process_all_folders(base_input_folder, base_output_folder)