Nano Banana 2.1 改完的图越改越糊——从输入尺寸和重绘范围倒查一遍

文章导读
越改越糊通常不是模型突然变差,而是迭代链路上有一步在反复损失信息:上一轮输出被当作下一轮输入时被压缩或缩放、重绘范围过大把已经稳定的区域反复重采样、轮数堆到第三轮时小偏差被叠加放大。排查顺序建议按输入尺寸 → 重绘范围 → 轮数逐个固定再回退,因为只有单独变化一个变量时,输出的差异才有解释力。
📋 目录
  1. A 先确认每一轮实际拿到的图是什么尺寸
  2. B 固定重绘范围,只改输入尺寸做对比
  3. C 固定输入尺寸,只放大与缩小重绘范围
  4. D 用固定命名的中间文件保存每轮输入输出
  5. E 给出越改越糊时的回退顺序
A A

越改越糊通常不是模型突然变差,而是迭代链路上有一步在反复损失信息:上一轮输出被当作下一轮输入时被压缩或缩放、重绘范围过大把已经稳定的区域反复重采样、轮数堆到第三轮时小偏差被叠加放大。排查顺序建议按输入尺寸 → 重绘范围 → 轮数逐个固定再回退,因为只有单独变化一个变量时,输出的差异才有解释力。

先别急着换模型或加采样参数。把每一轮真正送进模型的图和拿回来的图都存成固定命名的中间文件,记录像素尺寸、文件体积和来源;再做两组单变量对比:固定重绘范围只改输入尺寸,固定输入尺寸只改重绘范围。若退回原图、只跑一轮就能恢复细节,说明是迭代链路在累积损失;若缩小重绘范围后边缘变干净,说明问题在范围而不在模型。轮数不是越多越好,回退时优先降到能接受的最低轮数。

先确认每一轮实际拿到的图是什么尺寸

这一步是为了排除“输入被悄悄压缩”这个最容易被忽略的可能。常见来源有三类:从聊天窗口或网页另存,工具可能把长边压到某个默认值;用截图工具取图,默认格式往往是 JPEG,反复转存会累积压缩痕迹;从剪贴板粘贴进编辑界面,某些实现会先缩放再送进模型。这些都不会报错,只会让第三轮的边缘看起来像被抹过。

逐轮记录三件事:像素尺寸、文件体积、输入来源(本地原图 / 上一轮输出路径 / 剪贴板)。用 ImageMagick 或 ffprobe 读尺寸、用 stat 读体积即可:

for f in runs/*/input.png runs/*/output.png; do
  dims=$(identify -format "%wx%h" "$f")
  bytes=$(stat -c%s "$f")
  fmt=$(identify -format "%m" "$f")
  echo "$f  $dims  ${bytes}B  $fmt"
done

判断方式很直接:如果某一轮的 input.png 边长小于上一轮 output.png,那这一轮的模糊来自缩放,而不是模型;如果文件体积在尺寸不变的情况下逐轮变小,多半是格式或质量参数在退化,把中间文件统一存成无损 PNG 再对比一次。

固定重绘范围,只改输入尺寸做对比

这一组只让尺寸变,其它全部锁死:同一张 mask、同一段提示词、同一个随机种子和步数。把原图直接作为输入跑一次,再把它放大一档(例如长边乘 1.5 或 2,具体倍数按你手上的工具能力选)作为输入跑一次,其余参数不动。两次输出放在同一张画布上做 1:1 像素对照,重点看高频细节所在的位置:眼睫毛、细线、文字笔画、织物纹理。

通常可以观察到两种相反的情况。输入偏小时,细节在输入端就已经丢失,输出只能“猜”,放大后看得出涂抹和粘连;输入偏大时,部分流程会先缩到内部工作尺寸再处理,多出来的像素不一定换成细节,反而更耗时。所以不要默认“给得越大越好”,而是要找到你这套流程里明显的拐点,把它固定下来当作后续所有对比的基准尺寸。做这组实验时至少要保证两轮的 mask 完全一致,否则尺寸的影响和范围的影响会混在一起。

Nano Banana 2.1 改完的图越改越糊——从输入尺寸和重绘范围倒查一遍

固定输入尺寸,只放大与缩小重绘范围

这一组把输入锁死在上一步选定的尺寸,只改重绘区域的覆盖范围。做法是准备三份 mask:一份只圈住真正要改的局部、一份在原基础上向外扩一圈、一份接近全图。提示词、种子、步数保持相同,各跑一轮。

边缘和纹理是最能说明问题的观察点。范围收得较紧时,改完只影响目标区域,周围纹理保持原状,边界处偶尔能看到过渡不自然,可以用轻微羽化或边缘融合缓解。范围放大后,原本不需要动的区域也被重新生成一遍,容易出现三类可对照的痕迹:边界处出现重影或轻微错位、细密纹理被抹平或变得规律、整体色调出现小幅偏移。范围越接近全图,这些痕迹越明显,也就越容易在下一轮被继续放大。建议一次只扩一格或只收一格,别同时改范围和羽化半径,否则又变成两个变量。

用固定命名的中间文件保存每轮输入输出

要让回退有据可依,就得让“这一轮到底用了什么”可以被复读出来。建议目录结构按轮次分目录,每轮把输入、mask、输出和参数快照放在一起:

nb2/
  origin/
    src.png
  runs/
    r01_in-orig_mask-tight_seed-1234/
      input.png
      mask.png
      output.png
      params.json
    r02_in-r01out_mask-mid_seed-1234/
      input.png
      ...

命名规则建议统一为 r{轮次}_in{输入来源标签}_mask{范围标签}_seed{种子},只用小写字母、数字和连字符,避免空格和中文,这样在脚本里不用转义。params.json 里记录提示词、种子、步数、重绘范围标签和目标边长,作为那一轮的完整快照。

Nano Banana 2.1 改完的图越改越糊——从输入尺寸和重绘范围倒查一遍

把单轮执行写成一个接受目录参数的脚本,便于逐轮重跑:

#!/usr/bin/env bash
set -euo pipefail
run_dir="$1"

# 替换成你实际的调用方式:本地脚本、CLI 或对 Web 接口的封装
python tools/run_edit.py \
  `--input`  "$run_dir/input.png" \
  `--mask`   "$run_dir/mask.png" \
  `--params` "$run_dir/params.json" \
  `--out`    "$run_dir/output.png"

identify -format "%f %wx%h %b\n" "$run_dir/input.png" "$run_dir/output.png"

批量重跑时按目录顺序执行,中途可以停在任意一轮检查:

for d in runs/r*/; do ./rerun.sh "$d"; done

同一条命令重跑应得到可比较的结果;若同一目录两次输出的尺寸或格式不一致,先查这一步,再讨论清晰度。

给出越改越糊时的回退顺序

按下面的顺序退,每一步只改一件事,改完都回到同一套对照方式上验证。

  1. 退回原图。用 origin/src.png 作为输入,mask 和提示词保持当前这一轮的设置,只跑一轮。验证方式:把结果和第一轮的历史输出并排看同一区域,细节是否回到当时的水平。若明显恢复,说明模糊来自迭代链路本身,而不是某一次的参数。
  2. 缩小重绘范围。输入尺寸不变,把 mask 收到真正需要修改的区域,必要时加一点羽化。验证方式:对照范围扩大前后的输出,看边界重影、细纹理被抹平、色调偏移这三类痕迹是否减少。减到边缘干净为止,不要为了“顺手多改一点”而扩范围。
  3. 减少轮数。把整条链从三轮降到两轮或一轮,只保留必须的修改,能一次改完就不要拆成多次。验证方式:逐轮清点 input/output 的像素尺寸和文件体积,确认没有出现意外缩放或 JPEG 转存;再看最终输出的高频细节是否比三轮版本更完整。

这三步是排查顺序,不是优化手段。走完之后仍然糊,再依次检查模型版本、采样参数、分辨率相关的默认设置,同样保持一次只变一个变量,否则前面做的对照就白做了。