Tilt-shift miniature effect: Nano Banana 2.1 edit or Pillow blur

Make a photo look like a tiny model town: a Nano Banana 2.1 edit with auto ratio from $0.10 on Sume, or a free Pillow gradient blur. Both compared.

5 min readSume
All posts

To give a photo the tilt-shift miniature look, you can either blur the top and bottom of the frame in code, which is free, or ask an edit model to rebuild the scene as a tiny model with shallow focus. On Sume, Nano Banana 2.1 (google/nano-banana-2.1) is the edit row to try, because its ratio list includes auto, so the result keeps the shape of the source photo; one 1K image costs $0.10.

Google's release notes say Nano Banana 2.1 shipped on 2026-10-06 as its image generation and conversational editing model (read 2026-10-11). Sume's row, price and limits come from the Image API page and the catalog code. A pure blur cannot change what the scene is, so the two approaches give different results, and the cheap path is to try the code first.

The free version: a gradient blur

The miniature effect comes from a narrow strip of sharpness across the frame with strong blur above and below, plus saturated colour and a slight contrast lift. A photo taken from a high angle works best, because the eye reads the blur as a very close lens. The script below builds a vertical gradient mask and blends a blurred copy through it.

from PIL import Image, ImageEnhance, ImageFilter

def tilt_shift(src, dst, focus=0.55, band=0.12, radius=14):
    img = Image.open(src).convert("RGB")
    w, h = img.size
    blurred = img.filter(ImageFilter.GaussianBlur(radius))
    mask = Image.new("L", (w, h))
    px = mask.load()
    for y in range(h):
        dist = max(0.0, abs(y / h - focus) - band) / (0.5 - band)
        value = int(255 * min(1.0, dist * 1.6))
        for x in range(w):
            px[x, y] = value
    out = Image.composite(blurred, img, mask)
    out = ImageEnhance.Color(out).enhance(1.35)
    out = ImageEnhance.Contrast(out).enhance(1.12)
    out.save(dst, "JPEG", quality=92)

tilt_shift("street.jpg", "street_mini.jpg")

The model version: rebuild it as a model

A model edit can do what the blur cannot: simplify cars into toy shapes, add a glossy paint sheen and tidy clutter. Send the photo as a reference with aspect_ratio: "auto" and one of the resolution tiers. The docs say that on edit calls auto matches the reference, and that leaving the field out is not the same as auto.

import os, requests

r = requests.post(
    "https://api.sume.com/v1/images",
    headers={"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"},
    json={
        "model": "google/nano-banana-2.1",
        "prompt": "Make this look like a tilt-shift miniature model town: shallow depth of field, toy-like cars, saturated colour, keep the layout",
        "input_references": [
            {"type": "image_url", "image_url": {"url": "https://example.com/street.jpg"}}
        ],
        "aspect_ratio": "auto",
        "resolution": "1K",
        "n": 2,
    },
    timeout=60,
)
r.raise_for_status()
print(r.status_code, [i["url"] for i in r.json().get("data", [])] if r.status_code == 200 else "job")

What each route costs

Nano Banana 2.1 is priced by resolution tier. The first three rows below follow Sume's pricing code (list $0.08, $0.12 and $0.16 at 1K, 2K and 4K, with the 1.25 margin); the last row is the code route.

Tilt-shift options per image (Sume pricing code, read 2026-10-11)
RoutePrice per imageTen photosChanges the scene?
Nano Banana 2.1 at 1K$0.10$1.00Yes
Nano Banana 2.1 at 2K$0.15$1.50Yes
Nano Banana 2.1 at 4K$0.20$2.00Yes
Pillow gradient blur$0.00$0.00No, blur and colour only

A cheap order of operations

Run the Pillow version on every photo first and keep the ones that already look right. Send only the failures, usually flat or low-angle shots where blur alone reads as bad focus, to the model at 1K. If one comes back well, a 2K or 4K repeat of the same prompt costs $0.05 or $0.10 more per image. For example, four 1K tries plus one 4K final is 4 x $0.10 + $0.20 = $0.60.

Sume does not return a seed and does not accept one, so a 4K repeat will not be identical to the 1K draft; treat the draft as a check on the prompt, not a preview of the final pixels.

Choosing your source photo

The effect depends on the camera angle more than on the tool. Shoot or pick pictures taken from a balcony, bridge, rooftop or hillside, looking down at 30 to 60 degrees. Wide scenes with many small objects such as boats, cars, market stalls and sports pitches sell the illusion, because the viewer assumes tiny things must be models. Photos shot at eye level with a single large subject rarely work, with either code or a model, since there is no scale cue to fool.

Keep the sharp band across the part of the frame that holds the story, and move the focus value in the script to match. A band of 12 percent of the height on each side of the centre is a reasonable start; raise radius for a stronger effect and lower the saturation boost if skin tones turn orange.

Limits

Nano Banana 2.1 accepts up to 10 references and n up to 4 on Sume, far more than this edit needs. A call that outlasts the 30-second wait returns 202 with a job; the sample prints "job" in that case, and Jobs and results explains how to fetch the images. Failed generations are not billed.

Moving objects, crowds and legible signs are where model rebuilds drift: check people and text against the source before you publish.

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume