png圖片文件夾自動(dòng)摳除綠幕Py參考
發(fā)布日期:2025/5/30 7:00:31 瀏覽量:
png圖片文件夾自動(dòng)摳除綠幕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):
"""驗(yàn)證文件是否為有效的圖片"""
try:
img = Image.open(file_path)
img.verify() # 驗(yàn)證文件完整性
img.close()
return True
except Exception as e:
print(f"無(wú)效圖片: {file_path} - 錯(cuò)誤: {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):
"""
扣除綠幕背景并進(jìn)行邊緣羽化處理
參數(shù):
input_path: 輸入圖片路徑
output_path: 輸出圖片路徑
hsv_lower: HSV顏色空間下限 (H, S, V)
hsv_upper: HSV顏色空間上限 (H, S, V)
erode_size: 腐蝕操作核大小
dilate_size: 膨脹操作核大小
blur_size: 高斯模糊核大小 (必須為奇數(shù))
edge_threshold: 邊緣檢測(cè)閾值
"""
try:
# 使用PIL讀取圖片,支持更多格式
pil_img = Image.open(input_path).convert("RGBA")
img = cv2.cvtColor(np.array(pil_img), cv2.COLOR_RGBA2BGRA)
# 轉(zhuǎn)換為HSV顏色空間
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 創(chuàng)建綠色掩碼
lower_green = np.array(hsv_lower)
upper_green = np.array(hsv_upper)
mask = cv2.inRange(hsv, lower_green, upper_green)
# 形態(tài)學(xué)操作減少噪點(diǎn)
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)
# 反向掩碼(保留的區(qū)域)
mask_inv = cv2.bitwise_not(mask)
# 調(diào)整Alpha通道(邊緣羽化)
img[:, :, 3] = mask_inv
# 轉(zhuǎn)換回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} - 錯(cuò)誤: {str(e)}")
return False
def process_folder(input_folder, output_folder, **kwargs):
"""處理文件夾中的所有PNG圖片"""
# 創(chuàng)建輸出文件夾(如果不存在)
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
# 驗(yàn)證圖片有效性
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():
# 設(shè)置命令行參數(shù)
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=’高斯模糊核大小(必須為奇數(shù))’)
args = parser.parse_args()
# 驗(yàn)證輸入輸出路徑
input_folder = Path(args.input)
output_folder = Path(args.output)
if not input_folder.exists() or not input_folder.is_dir():
print(f"錯(cuò)誤: 輸入路徑 ’{input_folder}’ 不存在或不是目錄")
return
# 設(shè)置HSV參數(shù)
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處理結(jié)果:")
print(f" 總PNG文件數(shù): {total}")
print(f" 成功處理數(shù): {success}")
print(f" 失敗數(shù): {total - success}")
print(f"\n輸出文件夾: {output_folder}")
if __name__ == "__main__":
main()
啟動(dòng)參數(shù)
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 # 更精細(xì)的邊緣處理
hue-lower HSV 色相下限,控制綠色的范圍 35-50
hue-upper HSV 色相上限 85-100
saturation-lower HSV 飽和度下限,過(guò)低會(huì)誤判灰色區(qū)域 40-70
blur-size 羽化模糊程度,值越大邊緣越柔和 3-11(必須奇數(shù))
erode-size 腐蝕操作大小,減少邊緣噪點(diǎn) 1-5
dilate-size 膨脹操作大小,恢復(fù)主體尺寸 3-7
針對(duì)不同綠幕:
亮綠幕:嘗試 --hue-lower 40 --hue-upper 85
深綠幕:嘗試 --hue-lower 35 --hue-upper 90 --saturation-lower 30
精細(xì)調(diào)整邊緣:
邊緣有綠色殘留:增加 dilate-size
邊緣過(guò)度透明:減小 blur-size 或 erode-size
效果
開始處理文件夾: 1
? 已處理: st99.png
? 已處理: tyboy_green.png
? 已處理: 微信圖片_20250401085623.png
處理結(jié)果:
總PNG文件數(shù): 3
成功處理數(shù): 3
失敗數(shù): 0
輸出文件夾: 2
馬上咨詢: 如果您有業(yè)務(wù)方面的問(wèn)題或者需求,歡迎您咨詢!我們帶來(lái)的不僅僅是技術(shù),還有行業(yè)經(jīng)驗(yàn)積累。
QQ: 39764417/308460098 Phone: 13 9800 1 9844 / 135 6887 9550 聯(lián)系人:石先生/雷先生