Ir al contenido principal

API para eliminar objetos: crea una máscara y descarga la imagen editada

Elimina objetos con una máscara blanca sobre negro a 0,03 $ por imagen: pasos en el Playground, máscara, ejemplo en Python y soluciones a fallos comunes.

Autor
Lydia
Publicado
Lectura
9 min de lectura
Actualizado
Ilustración editorial de una editora de pelo rizado y gafas que marca una lámpara sobre una hoja transparente colocada encima de un retrato en una cafetería; no es un resultado de la API Object Eraser.

Usa spicyapi/object-eraser-v1/edit con image_url y un prompt breve, una mask_url o ambos. En una máscara, el blanco significa eliminar y el negro significa conservar, y sus dimensiones en píxeles deben coincidir con las de la imagen original. El precio es de 0,03 $ por imagen de salida, sin importar cuántos objetos elimine la solicitud. El resultado mantiene el tamaño original del lienzo y rellena la zona seleccionada con contenido de la escena circundante.

Elige entre prompt y máscara

Para un objeto inconfundible con espacio a su alrededor, empieza con una descripción corta:

el vaso de papel blanco en el suelo junto a la pata delantera derecha de la silla

Usa un sustantivo, un color o material visible y una posición. «Deja la escena limpia y premium» no identifica qué debe desaparecer. El prompt admite de 1 a 1000 caracteres, pero una descripción más larga no selecciona con más precisión.

SituaciónEntrada que conviene usar
Un único vaso inconfundible en un suelo despejadoprompt que nombre ese vaso
Dos vasos parecidos y solo uno sobramask_url sobre el vaso que quieres quitar
Cable fino u objeto pegado al borde del encuadremask_url; las descripciones suelen fallar aquí
Una descripción podría señalar el objeto equivocadoEnviar ambos, describiendo y marcando el mismo objetivo
Necesitas una silla recortada con fondo transparenteEliminación de fondo
Necesitas más espacio alrededor de la fotoOutpainting después de la limpieza

Una descripción que no coincide con nada devuelve la imagen sin cambios y la tarea se completa igualmente, así que compara la salida con el original antes de darla por una eliminación.

Un fotógrafo adulto fotografía un sillón azul; círculos editoriales marcan un vaso, un cable y un panel de cartón.

Ilustración con posibles selecciones. Todos los objetos marcados siguen presentes; no es una salida de la API.

Prueba primero en el Playground

  1. Abre la página de Object Eraser, quédate en la pestaña Playground en la vista Form e inicia sesión con una cuenta con saldo para ejecutar.
  2. Añade la foto en Input image (JPG, PNG o WebP, hasta 10 MB). Suelta un archivo, pega un enlace con Asset URL y Add URL, o búscalo en tu equipo.
  3. Describe el objetivo en Prompt, o añade tu imagen en blanco y negro en Mask, o rellena ambos. El formulario necesita al menos uno de los dos.
  4. Deja Output format en PNG (JPEG y WebP dan archivos más pequeños) y ejecuta. El precio es de 0,03 $ por imagen.
  5. Abre el resultado junto al original y la máscara, y usa la tabla de fallos de más abajo si queda algo.

El panel Request body muestra el mismo JSON que acepta la API, así que un prompt o una máscara que funcionen aquí se pueden copiar directamente al código. Si falla aquí, corrige el prompt o la máscara antes de escribir una sola línea de código.

Crea la máscara sobre la imagen exacta que vas a enviar

Si ya conoces la región (un cuadro de un detector o una selección en una interfaz), genera la máscara en código. Su tamaño sale del original, así que siempre coincide:

python
from PIL import Image, ImageDraw

src = Image.open("source.jpg")          # apply EXIF rotation and crop first
mask = Image.new("L", src.size, 0)      # black = keep
bbox = (src.width // 4, src.height // 3, src.width // 2, src.height // 2)
# Example coordinates only: adjust this box to the unwanted object in your photo.
ImageDraw.Draw(mask).rectangle(bbox, fill=255)  # white = remove
mask.save("mask.png")

Para formas irregulares sobre un original de 2400×1600, prepara en un editor de imágenes una máscara de 2400×1600:

  1. Termina primero la rotación y el recorte del original, y guarda esa imagen de trabajo.
  2. Añade una capa negra del tamaño completo del lienzo y baja su opacidad mientras dibujas para que el objetivo siga visible.
  3. Pinta el vaso de blanco, incluido su borde no deseado y su sombra de contacto, con un pequeño margen donde haya espacio. La pata de la silla permanece en negro.
  4. Devuelve la capa a opacidad total y expórtala sola como PNG opaco en blanco y negro, no como una foto atenuada ni con anotaciones de color.
  5. Superpón la máscara exportada al original de trabajo y comprueba la región blanca.

No basta con que las proporciones coincidan: ambos archivos necesitan el mismo ancho, alto, recorte y orientación. Una forma algo generosa funciona donde no hay nada más cerca. La máscara de ejemplo de la página del modelo para un estante en el borde del encuadre es un lienzo negro del tamaño de la foto con un único rectángulo blanco liso sobre el estante.

Las sombras y los reflejos pueden quedar fuera de la silueta del objeto. Pinta un reflejo no deseado como una región blanca aparte. Donde la sombra del vaso se solapa con la sombra de apoyo de la silla, no pintes toda la mancha oscura de blanco, o la silla puede acabar flotando. La máscara marca lo que se elimina; no aporta el suelo oculto ni la geometría del producto.

Haz las eliminaciones grandes o solapadas en pasadas separadas, construyendo cada máscara sobre la salida anterior ya aceptada. Dos objetos pequeños en una sola solicitud cuestan 0,03 $; dos solicitudes separadas cuestan 0,06 $. Mantén emparejados los nombres de archivo de la máscara y la imagen para que una selección antigua no edite en silencio una foto más reciente.

Después, ejecútalo desde código

Instala el SDK de Python (pip install spicyapi), define SPICY_API_KEY en el entorno de tu servidor y ejecuta la solicitud siguiente. Usa la foto de ejemplo de la página del modelo, así que funciona tal cual. Los archivos de tu equipo pasan por client.upload_file y vuelven como una dirección spicy://. Para una máscara, añade "mask_url" con tu propio archivo del mismo tamaño en píxeles que la foto.

python
import uuid
from spicyapi import SpicyClient, output_assets

client = SpicyClient()  # reads SPICY_API_KEY from the environment

task = client.create_task(
    model="spicyapi/object-eraser-v1/edit",
    input_data={
        "image_url": "https://cdn.spicyapi.ai/models/examples/inputs/fbc8d531c80e6d0d.jpeg",
        "prompt": "the wooden ladle lying across the sauna stones at the left",
        "output_format": "png",
    },
    idempotency_key=str(uuid.uuid4()),
)

final = client.wait_for_terminal(task["taskId"])
if final["state"] != "succeeded":
    raise RuntimeError(f"{task['taskId']} ended as {final['state']}: {final.get('errorCode')}")
print(output_assets(final)[0]["url"])  # copy the image to your own storage now

Las cargas, la creación, la espera, la descarga, los reintentos y los códigos de error se explican en la guía de tareas y en la referencia del SDK de Python. Los archivos generados se conservan 14 días como máximo, así que copia el resultado a tu propio almacenamiento.

O deja que lo ejecute un agente

Cuando un asistente debe hacer la edición, las tres herramientas oficiales muestran el precio y te piden confirmación antes de una llamada de pago.

  • CLI. Sube la foto y la máscara, y luego crea la tarea:

``bash spicyapi files upload photo.jpg spicyapi tasks create --model spicyapi/object-eraser-v1/edit --input-file input.json --wait ``

Pon las direcciones spicy:// devueltas en input.json como image_url y mask_url. Consulta la documentación de la CLI; npx @spicyapi/cli funciona sin instalar.

  • Servidor MCP. Añade el servidor MCP a tu asistente y pide: «Quita el vaso de papel blanco de esta foto con Object Eraser; el archivo está en /path/to/photo.jpg». Sube el archivo con spicyapi_upload_file, llama a spicyapi_task_create, que se detiene para que confirmes el precio, y después a spicyapi_task_wait.
  • Skill. npx skills add spicyapi-ai/spicy-skill instala el Agent Skill, con el que un asistente de programación lee el esquema vivo del modelo en lugar de adivinar los campos.

Corrige el fallo concreto que ves

Abre erased.png junto al original y la máscara. Comprueba primero dónde la selección toca el contenido que se conserva y después el centro del relleno.

ResultadoQué cambiar
El vaso sigue ahí tras una solicitud solo con promptCambia a una máscara sobre ese vaso.
El cable queda en el bordePinta de blanco toda su longitud visible en una máscara a resolución completa.
Queda un contorno tenueAmplía un poco la selección más allá del borde del objeto, sin cubrir bordes vecinos del producto.
El vaso ha desaparecido pero queda un óvalo oscuroAñade a la máscara la sombra de contacto del vaso, por separado de la sombra de la silla.
Una parte de la pata de la silla se reconstruye malReduce la máscara donde cubre la pata. Si el vaso tapa la propia pata, usa otra foto de origen.
Una comparación de diferencias muestra toda la imagen cambiadaAlinea primero rotación y tamaño; el ruido de compresión por sí solo no es una edición. Inspecciona puntos de referencia fijos.
La solicitud devuelve 400Comprueba si faltan el prompt y la máscara, o si envías campos que el modelo no tiene, como strength, mask_blur o transparent_background. No se cobra nada por una solicitud rechazada.
Un editor adulto examina una fotografía impresa de un interior, con círculos transparentes alrededor de la zona del vaso y una línea oscura en la mesa de cristal.

Ilustración sobre la inspección de sombras y reflejos. No muestra una eliminación terminada.

El modelo reconstruye el fondo oculto; no puede revelar lo que realmente había detrás del objeto. En la ficha de un producto, no aceptes una unión de silla inventada ni una costura de tapizado alterada solo porque el suelo se vea más limpio. Vuelve a fotografiar cuando el objeto eliminado oculte un detalle que la ficha deba mostrar con exactitud.

SpicyAPI no ejecuta ningún verificador de seguridad en este modelo; es el propio modelo quien decide lo que devuelve.

Guarda el original y la máscara junto con la salida aceptada, y añade otra pasada solo para un objeto concreto que siga ahí. La pestaña Examples de la página del modelo muestra resultados reales de antes y después.

También en English · 日本語 · 한국어 · Deutsch · Français · Português (Brasil) · Русский · Italiano · Polski