微立顶科技

新闻资讯

创新 服务 价值

  png图片文件夹自动抠除绿幕Py参考

发布日期:2025/5/30 7:00:31      浏览量:

png图片文件夹自动抠除绿幕Py参考


安装包

pip install opencv-python numpy

pip install pillow



参考Code

import cv2
import numpy as np
import os
from pathlib import Path
import argparse
from PIL import Image

def is_valid_image(file_path):
    """验证文件是否为有效的图片"""
    try:
        img = Image.open(file_path)
        img.verify()  # 验证文件完整性
        img.close()
        return True
    except Exception as e:
        print(f"无效图片: {file_path} - 错误: {str(e)}")
        return False

def remove_green_screen(input_path, output_path, hsv_lower=(40, 50, 50), hsv_upper=(90, 255, 255), 
                       erode_size=3, dilate_size=5, blur_size=5, edge_threshold=150):
    """
    扣除绿幕背景并进行边缘羽化处理
    
    参数:
    input_path: 输入图片路径
    output_path: 输出图片路径
    hsv_lower: HSV颜色空间下限 (H, S, V)
    hsv_upper: HSV颜色空间上限 (H, S, V)
    erode_size: 腐蚀操作核大小
    dilate_size: 膨胀操作核大小
    blur_size: 高斯模糊核大小 (必须为奇数)
    edge_threshold: 边缘检测阈值
    """
    try:
        # 使用PIL读取图片,支持更多格式
        pil_img = Image.open(input_path).convert("RGBA")
        img = cv2.cvtColor(np.array(pil_img), cv2.COLOR_RGBA2BGRA)
        
        # 转换为HSV颜色空间
        hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
        
        # 创建绿色掩码
        lower_green = np.array(hsv_lower)
        upper_green = np.array(hsv_upper)
        mask = cv2.inRange(hsv, lower_green, upper_green)
        
        # 形态学操作减少噪点
        if erode_size > 0:
            kernel = np.ones((erode_size, erode_size), np.uint8)
            mask = cv2.erode(mask, kernel, iterations=1)
        
        if dilate_size > 0:
            kernel = np.ones((dilate_size, dilate_size), np.uint8)
            mask = cv2.dilate(mask, kernel, iterations=1)
        
        # 边缘羽化处理
        if blur_size > 0:
            mask = cv2.GaussianBlur(mask, (blur_size, blur_size), 0)
        
        # 反向掩码(保留的区域)
        mask_inv = cv2.bitwise_not(mask)
        
        # 调整Alpha通道(边缘羽化)
        img[:, :, 3] = mask_inv
        
        # 转换回PIL并保存
        result_pil = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGRA2RGBA))
        result_pil.save(output_path, "PNG")
        
        return True
    except Exception as e:
        print(f"处理失败: {input_path} - 错误: {str(e)}")
        return False

def process_folder(input_folder, output_folder, **kwargs):
    """处理文件夹中的所有PNG图片"""
    # 创建输出文件夹(如果不存在)
    os.makedirs(output_folder, exist_ok=True)
    
    # 遍历文件夹中的所有文件
    total_files = 0
    success_files = 0
    
    for filename in os.listdir(input_folder):
        if filename.lower().endswith(’.png’):
            input_path = os.path.join(input_folder, filename)
            output_path = os.path.join(output_folder, filename)
            total_files += 1
            
            # 验证图片有效性
            if not is_valid_image(input_path):
                continue
            
            # 处理图片
            if remove_green_screen(input_path, output_path, **kwargs):
                success_files += 1
                print(f"✓ 已处理: {filename}")
            else:
                print(f"✗ 处理失败: {filename}")
    
    return total_files, success_files

def main():
    # 设置命令行参数
    parser = argparse.ArgumentParser(description=’绿幕图片处理工具’)
    parser.add_argument(’--input’, ’-i’, required=True, help=’输入文件夹路径’)
    parser.add_argument(’--output’, ’-o’, required=True, help=’输出文件夹路径’)
    parser.add_argument(’--hue-lower’, type=int, default=40, help=’HSV色相下限’)
    parser.add_argument(’--hue-upper’, type=int, default=90, help=’HSV色相上限’)
    parser.add_argument(’--saturation-lower’, type=int, default=50, help=’HSV饱和度下限’)
    parser.add_argument(’--saturation-upper’, type=int, default=255, help=’HSV饱和度上限’)
    parser.add_argument(’--value-lower’, type=int, default=50, help=’HSV明度下限’)
    parser.add_argument(’--value-upper’, type=int, default=255, help=’HSV明度上限’)
    parser.add_argument(’--erode-size’, type=int, default=3, help=’腐蚀操作核大小’)
    parser.add_argument(’--dilate-size’, type=int, default=5, help=’膨胀操作核大小’)
    parser.add_argument(’--blur-size’, type=int, default=5, help=’高斯模糊核大小(必须为奇数)’)
    
    args = parser.parse_args()
    
    # 验证输入输出路径
    input_folder = Path(args.input)
    output_folder = Path(args.output)
    
    if not input_folder.exists() or not input_folder.is_dir():
        print(f"错误: 输入路径 ’{input_folder}’ 不存在或不是目录")
        return
    
    # 设置HSV参数
    hsv_lower = (args.hue_lower, args.saturation_lower, args.value_lower)
    hsv_upper = (args.hue_upper, args.saturation_upper, args.value_upper)
    
    # 处理文件夹
    print(f"开始处理文件夹: {input_folder}")
    total, success = process_folder(
        str(input_folder), 
        str(output_folder),
        hsv_lower=hsv_lower,
        hsv_upper=hsv_upper,
        erode_size=args.erode_size,
        dilate_size=args.dilate_size,
        blur_size=args.blur_size
    )
    
    print(f"\n处理结果:")
    print(f"  总PNG文件数: {total}")
    print(f"  成功处理数: {success}")
    print(f"  失败数: {total - success}")
    print(f"\n输出文件夹: {output_folder}")

if __name__ == "__main__":
    main()


启动参数

python green_screen_remover.py -i 输入文件夹路径 -o 输出文件夹路径

python green_screen_remover.py -i ./greenscreen_images -o ./processed_images --blur-size 7


--hue-lower 35 --hue-upper 95 # 更广泛的绿色范围

--erode-size 2 --dilate-size 6 --blur-size 7 # 更精细的边缘处理


hue-lower HSV 色相下限,控制绿色的范围 35-50
hue-upper HSV 色相上限 85-100
saturation-lower HSV 饱和度下限,过低会误判灰色区域 40-70
blur-size   羽化模糊程度,值越大边缘越柔和 3-11(必须奇数)
erode-size     腐蚀操作大小,减少边缘噪点 1-5
dilate-size     膨胀操作大小,恢复主体尺寸 3-7


针对不同绿幕:
亮绿幕:尝试 --hue-lower 40 --hue-upper 85
深绿幕:尝试 --hue-lower 35 --hue-upper 90 --saturation-lower 30


精细调整边缘:
边缘有绿色残留:增加 dilate-size
边缘过度透明:减小 blur-size 或 erode-size


效果

开始处理文件夹: 1
✓ 已处理: st99.png
✓ 已处理: tyboy_green.png
✓ 已处理: 微信图片_20250401085623.png

处理结果:
  总PNG文件数: 3
  成功处理数: 3
  失败数: 0

输出文件夹: 2





  业务实施流程

需求调研 →

团队组建和动员 →

数据初始化 →

调试完善 →

解决方案和选型 →

硬件网络部署 →

系统部署试运行 →

系统正式上线 →

合作协议

系统开发/整合

制作文档和员工培训

售后服务

马上咨询: 如果您有业务方面的问题或者需求,欢迎您咨询!我们带来的不仅仅是技术,还有行业经验积累。
QQ: 39764417/308460098     Phone: 13 9800 1 9844 / 135 6887 9550     联系人:石先生/雷先生