dxfedit/06_Image_Processing/process_images.py
puzzlesion 7d3dee3db5 feat(image): add initial image processing module
This commit introduces a new project module
2025-09-15 10:10:08 +08:00

99 lines
3.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import os
from PIL import Image
import numpy as np
def process_image(image_path, output_path):
"""
处理单个PNG图像去除白色背景并根据最外侧的黑边进行裁剪。
参数:
image_path (str): 输入PNG图像的路径。
output_path (str): 保存处理后PNG图像的路径。
"""
try:
# 打开图像并确保其为RGBA格式
img = Image.open(image_path).convert('RGBA')
# 将图像转换为NumPy数组以便高效处理
data = np.array(img)
# 定义黑色的阈值例如RGB值均小于50
# 这将创建一个布尔掩码其中True表示黑色像素
black_pixels = (data[:, :, 0] < 50) & (data[:, :, 1] < 50) & (data[:, :, 2] < 50)
# 查找所有黑色像素的坐标
black_coords = np.where(black_pixels)
# 如果没有找到黑色像素,我们将无法裁剪。
# 此时仅去除白色背景并保存。
if len(black_coords[0]) == 0:
print(f"警告: 在 {os.path.basename(image_path)} 中未找到黑色边框。仅去除白色背景。")
# 为不裁剪设置左上角和右下角坐标
top, left = 0, 0
bottom, right = data.shape[0] - 1, data.shape[1] - 1
else:
# 确定黑色边框的边界框
top = np.min(black_coords[0])
bottom = np.max(black_coords[0])
left = np.min(black_coords[1])
right = np.max(black_coords[1])
# 使用边界框裁剪原始图像。
# 裁剪区域指定为 (left, upper, right, lower)。
# right 和 lower 是排他性的所以我们加1。
cropped_img = img.crop((left, top, right + 1, bottom + 1))
# 将裁剪后的图像转换为NumPy数组
cropped_data = np.array(cropped_img)
# 定义白色的阈值例如RGB值均大于220
white_pixels_mask = (cropped_data[:, :, 0] > 220) & (cropped_data[:, :, 1] > 220) & (cropped_data[:, :, 2] > 220)
# 将白色像素的alpha通道设置为0完全透明
cropped_data[white_pixels_mask, 3] = 0
# 从修改后的数组创建新图像
final_img = Image.fromarray(cropped_data)
# 保存最终图像
final_img.save(output_path)
print(f"成功处理 {os.path.basename(image_path)} 并保存到 {os.path.basename(output_path)}")
except Exception as e:
print(f"处理 {os.path.basename(image_path)} 时出错: {e}")
def main():
"""
主函数用于查找并处理指定目录中的所有PNG图像。
"""
# 用户指定的输入目录
input_dir = r"C:\Users\83500\Desktop\示例文件夹"
# 在输入目录内创建一个'processed'子目录用于存放输出文件
output_dir = os.path.join(input_dir, "processed")
if not os.path.isdir(input_dir):
print(f"错误: 输入目录 '{input_dir}' 未找到。")
return
if not os.path.exists(output_dir):
os.makedirs(output_dir)
print(f"已创建输出目录: {output_dir}")
# 遍历输入目录中的所有文件
file_found = False
for filename in os.listdir(input_dir):
# 检查文件是否为PNG图像
if filename.lower().endswith(".png"):
file_found = True
image_path = os.path.join(input_dir, filename)
output_path = os.path.join(output_dir, filename)
process_image(image_path, output_path)
if not file_found:
print(f"在目录 '{input_dir}' 中没有找到PNG文件。")
if __name__ == "__main__":
main()