欢迎光临
我们一直在努力

2:调用lama-cleaner 接口 Python批处理清除水印

书接上回 《windows轻松搞定lama-cleaner 本地化部署运行》

https://blog.csdn.net/xiaoma0529/article/details/156940767?spm=1001.2014.3001.5502

上回咱们成功将 Lama-cleaner 请到本地,笔刷轻点,水印即消,好不痛快! 今儿个,咱们更进一步——不靠手动,改用 Python 批量调兵遣将,让百张带水印的图,自动“净身”! 本文将手把手教你:如何通过 Python 脚本,调用本地已部署的 Lama-cleaner 接口,实现批量去水印。


第一回:确保 lama-cleaner 已启动:

首先,请确认你已在命令行中启动服务:

lama-cleaner –model=lama –device=cpu –port=8080

接着,在浏览器中访问 http://localhost:8080,若能看到 Web 界面,说明服务已就绪。


第二回:开启“下载掩码图”功能

在 Web 界面右上角点击 “设置”(Settings) 按钮, 在弹出的设置面板中,勾选 “Download Mask” 选项,以便后续保存掩码图像。

✅ 此步骤至关重要!只有开启此选项,才能在保存结果时同时下载对应的掩码图。

在Settings界面中 打开 Download Mask 下载掩码图的开关,如下图所示:


第三回:制作并保存掩码图

  • 上传一张带水印的示例图片(如 1.jpg)。
  • 使用画笔工具,精确涂抹水印区域。
  • 点击 “Save Image”,系统将自动下载两个文件:
    • 1_cleanup.jpg:去水印后的结果图
    • 1_mask.jpg:对应的掩码图(黑白图)
  • ⚠️ 重要提示: 请保留这张 mask.jpg!后续所有待处理图片必须与该掩码图尺寸完全一致,否则脚本会跳过处理。 (适用于水印位置固定、图片尺寸统一的场景,例如:水印均在右下角)

    请保留这个掩码文件,后续脚本将复用它处理所有图片。 ⚠️ 注意:所有待处理图片必须与掩码图尺寸完全一致,否则会被跳过。

    以下为掩码图片案例:


    第四回:编写Python批处理脚本

    代码文件命名为 batch_inpaint.py

    项目目录结构建议如下:

    your_project/
    ├── images/ # ✅ 存放待处理的原始图片(支持 .jpg/.jpeg/.png)
    ├── mask.jpg # ✅ 掩码文件(黑白图,白色区域表示要修复/去水印的位置)
    ├── out/ # 📁 脚本自动创建,存放处理后的输出图片
    └── batch_inpaint.py # 👈 本脚本文件

    省脑省心,将以下代码保存为 batch_inpaint.py

    import os
    import glob
    import requests
    from PIL import Image
    # ================== 配置区 ==================
    LAMA_URL = "http://localhost:8080/inpaint" # 确认可用
    MASK_PATH = "mask.jpg" # 支持 jpg/png
    INPUT_DIR = "images"
    OUTPUT_DIR = "out"
    # ==========================================
    if not os.path.exists(MASK_PATH):
    raise FileNotFoundError(f"掩码文件未找到: {MASK_PATH}")
    os.makedirs(OUTPUT_DIR, exist_ok=True)
    image_extensions = ["*.jpg", "*.jpeg", "*.png"]
    image_paths = []
    for ext in image_extensions:
    image_paths.extend(glob.glob(os.path.join(INPUT_DIR, ext)))
    if not image_paths:
    raise ValueError(f"在 '{INPUT_DIR}' 中未找到任何图片")
    print(f"找到 {len(image_paths)} 张图片,开始批量去水印…")
    # 检查 mask 尺寸
    try:
    mask_img = Image.open(MASK_PATH)
    mask_size = mask_img.size
    except Exception as e:
    raise RuntimeError(f"无法读取掩码: {e}")
    # 完整的 form data 参数(来自你的浏览器截图)
    form_data = {
    "ldmSteps": "25",
    "ldmSampler": "plms",
    "zitsWireframe": "true",
    "hdStrategy": "Crop", # 或 Original、Resize
    "hdStrategyCropMargin": "196",
    "hdStrategyCropTrigerSize": "800",
    "hdStrategyResizeLimit": "2048",
    "prompt": "", # 可留空
    "negativePrompt": "",
    "croperX": "712",
    "croperY": "280",
    "croperHeight": "512",
    "croperWidth": "512",
    "useCroper": "false",
    "sdMaskBlur": "5",
    "sdStrength": "0.75",
    "sdSteps": "50",
    "sdGuidanceScale": "7.5",
    "sdSampler": "uni_pc",
    "sdSeed": "-1",
    "sdMatchHistograms": "false",
    "sdScale": "1",
    "cv2Radius": "5",
    "cv2Flag": "INPAINT_NS",
    "paintByExampleSteps": "50",
    "paintByExampleGuidanceScale": "7.5",
    "paintByExampleSeed": "-1",
    "paintByExampleMaskBlur": "5",
    "paintByExampleMatchHistograms": "false",
    "p2pSteps": "50",
    "p2pImageGuidanceScale": "1.5",
    "p2pGuidanceScale": "7.5",
    "controlnet_conditioning_scale": "0.4",
    "controlnet_method": "control_v11p_sd15_canny",
    }
    for img_path in image_paths:
    filename = os.path.basename(img_path)
    output_path = os.path.join(OUTPUT_DIR, filename)
    try:
    orig_img = Image.open(img_path)
    if orig_img.size != mask_size:
    print(f"跳过 {filename}:尺寸不匹配")
    continue
    except Exception as e:
    print(f"无法打开 {filename}: {e}")
    continue
    try:
    with open(img_path, "rb") as f_img:
    with open(MASK_PATH, "rb") as f_mask:
    files = {
    "image": f_img,
    "mask": f_mask,
    }
    # 发送所有表单数据
    response = requests.post(LAMA_URL, files=files, data=form_data, timeout=60)
    if response.status_code == 200:
    with open(output_path, "wb") as out_file:
    out_file.write(response.content)
    print(f"已处理: {filename}")
    else:
    print(f"处理失败 {filename}: HTTP {response.status_code}, 响应: {response.text}")
    except Exception as e:
    print(f"请求出错 {filename}: {e}")
    print("批量处理完成!结果已保存至 'out/' 文件夹。")

    这段 Python 脚本用于批量调用 LaMa(或类似)图像修复服务(inpainting)去除水印,其核心逻辑是:对指定目录中的每张图片,使用一张固定掩码(mask)标记要去除的区域,然后通过 HTTP 请求发送到本地运行的 inpainting 服务进行处理,并保存结果。

    关键要求:所有 images/ 中的图片必须与 mask.jpg 尺寸完全一致,否则会被跳过。


    第五回:执行脚本,见证奇迹

    python batch_inpaint.py

    代码运行后在控制台若看到类似以下输出,说明一切顺利!

    所有去水印后的图片,将整齐存放在 out/ 目录中。

    注:本案例中需要去除水印的312张图片,水印位置均在图片右小角固定不变。

    结语 诸位看官,至此水印已除,千图焕然! Python 为令,Lama 为工,掩码作眼,批量成风。 此法特别适用于:水印位置固定、图片尺寸统一的批量处理场景(如证件照、产品图、监控截图等)。 若你照此施为,保管图清如洗、心静如水。 下回若有新招——自动识别水印、智能生成掩码,咱们再摆香案,细说分明! ——且散,且去,莫忘点赞收藏!✨

    赞(0)
    未经允许不得转载:171主机测评 » 2:调用lama-cleaner 接口 Python批处理清除水印
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址