Ideogram Object Remover
Mask it, delete it, keep the rest pixel-identical
- image
- mask
- advancedFeatures.watermark.image
- image
There are two ways to make something disappear from a photo, and they're not the same thing. A whole-image edit model will happily remove the tourist standing in your shot - and while it's at it, it'll also subtly reimagine the lighting, the crowd behind them, and the bricks on the wall. Ideogram Object Remover is the other way: you paint a mask over the thing you hate, and the model fills only that region. Everything outside the mask comes back untouched.
That's the whole remaining superpower of mask-based inpainting, and it's worth being picky about: an instruction edit regenerates the frame, so unmasked pixels drift on every pass, and the drift compounds if you chain edits. A masked removal composites the new pixels back over the original, and nothing else moved. If the rest of the image matters - a product photo, a headshot, a building that has to keep its exact proportions - this is the node you want.
How it works
This is a hosted Ideogram model (ideogram:object-remover@0, task imageInference) running on Runware's cloud. You feed it two required inputs:
image- the photo as a nativeIMAGEtensor.mask- a mask, also as anIMAGE, where the white region is what gets removed and regenerated.
Note the socket type: it's IMAGE, not MASK. ComfyUI distinguishes the two, so you'll want to convert - or generate a mask that's already an image (mask-paint nodes with an image output, or a Mask → Image convert in the middle of your graph). White = the region to erase.
The node posts both up, the model inpaints the masked area, and the result comes back as an IMAGE you can wire straight into Preview or Save. Because you're on the API, there's no local model, no VRAM, no 9.3B download to babysit.
Inputs that matter
image/mask- the required pair above.seed- set it for reproducible removals; leave 0 for a random one.numberResults- 1 to 20, each with a different seed. Useful when the fill is a coin flip (is it going to hallucinate a sign where the sign was?).outputFormat/outputQuality-JPGdefault, orPNG/WEBP, quality 20–99.
There's also the standard Runware watermark block (advancedFeatures.watermark.*) and safety.checkContent if you want a content check on the output. For a straightforward removal you can ignore all of them.
Installing it
Everything here ships in the Runware/ComfyUI-Runware pack. Install it once via ComfyUI Manager (search Runware) and restart, or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/Runware/ComfyUI-Runware
pip install -r ComfyUI-Runware/requirements.txt
No model downloads - the heavy lifting is remote. Dependencies are just runware-sdk, pillow, soundfile.
Gotchas
- API key required. Set it in ComfyUI Settings → Runware API key, or
RUNWARE_API_KEY, orrunware auth login. The node refuses to run without one. - Paid per call, like everything in this pack. The cost prints on the node title bar.
- Mask quality is everything. A sloppy mask that bleeds over the subject you want to keep will get the bleed regenerated too. Feather it and keep it tight - the model fills exactly what you mask.
- If you're checking a large batch, remember each
numberResultspast 1 is a separate billed generation.
Inputs (18)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| mask | IMAGE | — | |
| advancedFeatures.watermark.imageopt | IMAGE | — | |
| seedopt | INT | 00–2147483647 | Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range. |
| numberResultsopt | INT | 11–20 | Number of results to generate. Each result uses a different seed, producing variations of the same parameters. |
| advancedFeaturesopt | BOOLEAN | false | Enable to set advancedFeatures. Off uses the model's default. |
| advancedFeatures.watermark.bgColoropt | STRING | Background color in hex format. | |
| advancedFeatures.watermark.displayPositionopt | COMBO | (default) | Watermark position. |
| advancedFeatures.watermark.fontColoropt | STRING | Text color in hex format. | |
| advancedFeatures.watermark.opacityopt | BOOLEAN | false | Enable to set advancedFeatures.watermark.opacity. Off uses the model's default. |
| advancedFeatures.watermark.opacity_valueopt | FLOAT | 0.100.1–1 | Watermark opacity. |
| advancedFeatures.watermark.textopt | STRING | Watermark text. | |
| safetyopt | BOOLEAN | false | Enable to set safety. Off uses the model's default. |
| safety.checkContentopt | BOOLEAN | false | Enable or disable content safety checking. Increases total generation time. |
| ttlopt | BOOLEAN | false | Enable to set ttl. Off uses the model's default. |
| ttl_valueopt | INT | 60 | Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`. |
| outputFormatopt | COMBO | JPG | File format for the generated image. |
| outputQualityopt | INT | 9520–99 | Compression quality of the output. Higher values preserve quality but increase file size. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |