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 联系人:石先生/雷先生