---
title: Adding film grain — Topaz Labs Wonder 3.5 | Runware Docs
url: https://runware.ai/docs/models/topazlabs-wonder-3-5/guides/film-grain
description: "How to add film grain to a Wonder 3.5 upscale with settings.grain: the silver, gaussian, and grey grain models and the strength, density, and size controls."
---
A hard upscale can come back looking **too clean to be a photograph**. When Wonder rebuilds a smooth sky or a car panel at high strength, the result is sharp and even in a way real film never is, which is one of the tells of an enhanced image. `settings.grain` puts the texture back, laying an organic grain over the frame so the upscale reads as **shot rather than synthesised**. The clean upscale below and the same frame with grain sit side by side:

![A cinematic shot of a cream convertible on a coastal road, very clean and smooth](https://runware.ai/docs/assets/output-car-clean.CqsmP3fe_Z2oCz5h.jpg)

*The same 2× upscale, clean versus a default silver grain. Drag to compare, and open at full size for the texture.*

Grain is a texture, so it lives at the pixel level and mostly disappears at page width. A 100% crop of the sky is where the difference shows, the flat gradient picking up a fine, even tooth:

![A close crop of the smooth sky gradient with no grain](https://runware.ai/docs/assets/crop-clean.DwXIR-Dk_GG1j6.jpg)

*Clean · 100% crop*

![The same sky crop with a fine silver film grain](https://runware.ai/docs/assets/crop-silver.beFkYMIy_Z2gyXsv.jpg)

*Silver grain · 100% crop*

### [The request](https://runware.ai/docs/models/topazlabs-wonder-3-5/guides/film-grain#the-request)

`settings.grain` takes a boolean or an object. Pass `true` to apply the default grain, or an object to control the look. The object has four keys: `model`, `strength`, `density`, and `size`. Omitting `grain`, or setting it to `false`, leaves it off.

TypeScriptPythoncURLCLIJSON

```typescript
import { createClient } from '@runware/sdk'

const client = await createClient({ apiKey: process.env.RUNWARE_API_KEY })
await client.connect()

const [result] = await client.run({
  model: 'topazlabs:wonder@3.5',
  upscaleFactor: 2,
  settings: {
    grain: {
      model: 'silver',
      strength: 0.5,
      density: 0.5,
      size: 1
    }
  },
  inputs: {
    image: 'https://im.runware.ai/image/os/a14d18/ws/2/ii/1a2b3c4d-5e6f-4708-9a1b-2c3d4e5f6071.jpg'
  }
})
```

```python
import asyncio
import os

from runware import Runware

async def main():
    async with Runware(api_key=os.environ["RUNWARE_API_KEY"]) as client:
        results = await client.run({
            "model": "topazlabs:wonder@3.5",
            "upscaleFactor": 2,
            "settings": {
                "grain": {
                    "model": "silver",
                    "strength": 0.5,
                    "density": 0.5,
                    "size": 1
                }
            },
            "inputs": {
                "image": "https://im.runware.ai/image/os/a14d18/ws/2/ii/1a2b3c4d-5e6f-4708-9a1b-2c3d4e5f6071.jpg"
            }
        })

asyncio.run(main())
```

```bash
curl https://api.runware.ai/v1 \
  -H "Authorization: Bearer $RUNWARE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '[
    {
      "taskType": "upscale",
      "taskUUID": "d9e0f1a2-3b4c-4d5e-9f6a-7b8c9d0e1f2a",
      "model": "topazlabs:wonder@3.5",
      "upscaleFactor": 2,
      "settings": {
        "grain": {
          "model": "silver",
          "strength": 0.5,
          "density": 0.5,
          "size": 1
        }
      },
      "inputs": {
        "image": "https://im.runware.ai/image/os/a14d18/ws/2/ii/1a2b3c4d-5e6f-4708-9a1b-2c3d4e5f6071.jpg"
      }
    }
  ]'
```

```bash
runware run topazlabs:wonder@3.5 \
  upscaleFactor=2 \
  settings.grain.model=silver \
  settings.grain.strength=0.5 \
  settings.grain.density=0.5 \
  settings.grain.size=1 \
  inputs.image=https://im.runware.ai/image/os/a14d18/ws/2/ii/1a2b3c4d-5e6f-4708-9a1b-2c3d4e5f6071.jpg
```

```json
{
  "taskType": "upscale",
  "taskUUID": "d9e0f1a2-3b4c-4d5e-9f6a-7b8c9d0e1f2a",
  "model": "topazlabs:wonder@3.5",
  "upscaleFactor": 2,
  "settings": {
    "grain": {
      "model": "silver",
      "strength": 0.5,
      "density": 0.5,
      "size": 1
    }
  },
  "inputs": {
    "image": "https://im.runware.ai/image/os/a14d18/ws/2/ii/1a2b3c4d-5e6f-4708-9a1b-2c3d4e5f6071.jpg"
  }
}
```

Response

```json
[
  {
    "taskType": "upscale",
    "taskUUID": "d9e0f1a2-3b4c-4d5e-9f6a-7b8c9d0e1f2a",
    "imageUUID": "6c7d8e9f-0a1b-4c2d-8e3f-4a5b6c7d8e9f",
    "imageURL": "https://im.runware.ai/image/os/a14d18/ws/2/ii/6c7d8e9f-0a1b-4c2d-8e3f-4a5b6c7d8e9f.jpg"
  }
]
```

### [Grain models](https://runware.ai/docs/models/topazlabs-wonder-3-5/guides/film-grain#grain-models)

`model` sets the **character** of the grain. `silver` is the default and emulates the fine, slightly clumped grain of photographic film. `gaussian` lays down even statistical noise for a more digital, uniform speckle. `grey` applies grain to luminance only, so the texture appears without the colour flecks the other two can introduce. The three read clearly at 100%:

![A sky crop with fine, slightly organic silver film grain](https://runware.ai/docs/assets/crop-silver.beFkYMIy_Z2gyXsv.jpg)

*silver*

![The same crop with even, uniform gaussian noise](https://runware.ai/docs/assets/crop-gaussian.sVmNssam_5Yzrd.jpg)

*gaussian*

![The same crop with monochrome luminance-only grain](https://runware.ai/docs/assets/crop-grey.B1iKKk_P_2ai4oM.jpg)

*grey*

Reach for `silver` when you want a photographic film look, `gaussian` when you want a flatter digital noise, and `grey` when colour speckle would fight a clean grade or a monochrome image.

### [Strength, density, and size](https://runware.ai/docs/models/topazlabs-wonder-3-5/guides/film-grain#strength-density-and-size)

Three numbers shape how the chosen grain sits on the frame:

- `strength` (0 to 1, default 0.5) sets how **visible** the grain is, from a whisper of texture to a heavy overlay.
- `density` (0 to 1, default 0.5) sets how **thickly the grains are packed** across the image, from sparse and open to dense and busy.
- `size` (1 to 5, default 1) sets the **particle size**, from a fine tooth at 1 to a coarse, chunky grain at 5.

Strength is the control you will reach for most. Stepping it from low to high takes the sky from a barely-there texture to an unmistakable film overlay:

![A sky crop with faint grain at low strength](https://runware.ai/docs/assets/crop-strength-low.DXH_VuTX_ZiHnqf.jpg)

*strength 0.2*

![The same crop with moderate grain at default strength](https://runware.ai/docs/assets/crop-silver.beFkYMIy_Z2gyXsv.jpg)

*strength 0.5*

![The same crop with heavy grain at high strength](https://runware.ai/docs/assets/crop-strength-high.PeBgCA03_1ry6tx.jpg)

*strength 0.9*

`size` changes the feel rather than the amount. A fine grain suits a clean, modern look, while a coarser particle reads as older or higher-speed stock:

![A sky crop with a fine grain particle](https://runware.ai/docs/assets/crop-silver.beFkYMIy_Z2gyXsv.jpg)

*size 1 · fine*

![The same crop with a coarse, chunky grain particle](https://runware.ai/docs/assets/crop-size-coarse.DHvB-K90_2kqS74.jpg)

*size 4 · coarse*

> [!NOTE]
> Grain is easy to overdo. On a portrait or a product shot a light touch, `strength` around 0.2 to 0.3, reads as film texture, while the default 0.5 can look heavy up close. Judge it at 100%, since anything you can clearly see at page width will be strong in the file.

### [When to reach for it](https://runware.ai/docs/models/topazlabs-wonder-3-5/guides/film-grain#when-to-reach-for-it)

Grain earns its place in three jobs. The first is **undoing the too-clean look** of a hard upscale, giving a reconstructed frame back the organic texture that sells it as a photograph. The second is **matching an upscaled still into grainy footage**, so a frame lifted from a film-look sequence carries the same tooth as the shots around it instead of standing out as suspiciously smooth. The third is **unifying a set**: running a batch through the same grain settings gives a mixed collection of clean and textured sources one consistent finish.

Because grain is applied as the final step of the upscale, it lands on the reconstructed detail rather than the source, so you get an even, deliberate texture instead of the uneven noise a degraded original carried.

### [Tips](https://runware.ai/docs/models/topazlabs-wonder-3-5/guides/film-grain#tips)

1. **Start with the default model.** `silver` is the film-like default and the right starting point for most photographic work. Switch to `gaussian` for a flatter digital noise or `grey` to keep grain out of the colour channels.
    
2. **Lead with the strength control.** `strength` changes the result more than the others. Start low, around 0.2 to 0.3, and raise it only if the texture is too faint.
    
3. **Match grain size to the era.** A fine `size` reads clean and modern, a coarse one reads like older or high-speed film stock. Pick it for the look you are after.
    
4. **Judge grain at 100%.** It vanishes at page width and can be far too strong in the full-resolution file. Always check the native size before committing.
    
5. **Use one recipe across a set.** Applying the same grain settings to every image in a batch ties clean and textured sources into a single, consistent look.