截图 UTCk3 时间框去除 (utc_frame_remover)
> 依赖:python -m pip install -r <本技能目录>/requirements.txt(opencv-python、numpy、pillow)。
触发
用户说:「去UTC框 处理 <文件夹或文件路径>」,或更短的「去UTC <路径>」「去时框 <路径>」。
也识别「去时间框」「去掉时间框」「移除 UTCK3 时钟」等表述,含义一致。
目标对象(关键认知)
截图右上角的"时间框"是 UTCk3 世界时钟悬浮窗(KRISS 韩国标准科学研究院授时工具):
- 标题栏:
UTCk3+ 最小化/关闭按钮 - 按钮行:세계시 / 설정 / 도움말 / 감추기 + 右侧竖排 비교/동기 按钮
- 黑色显示屏:绿色 LED 日期行
2026년 09월 03일 목요일+ 大数字HH:MM:SS - 状态行(灰底黄字)+ 底部
KRISS 한국표준과학연구원
面板在截图中的位置不固定(悬浮窗可拖动),必须先识别后去除,不可硬编码坐标。
处理原理
- 检测:高饱和绿色 LED 特征(HSV 过滤)→ 膨胀连通域 → 尺寸/黑底过滤 →
同行近邻簇横向合并(v1.2.1:紧凑版面板时间行会被冒号间隙/JPEG 压缩拆成
多个 40~60px 小簇,先以宽松阈值 RAW_MIN_GREEN=150 / RAW_W_MIN=40 收集,
横向合并重组后再套正式阈值 绿色≥300 / 宽≥60)→ 日期行与时间行近邻簇
垂直合并 → 以时间数字行为锚点。
- 黑底占比阈值 0.45(v1.2.1):真显示屏群组实测 dark≈0.8+;页面上
大块绿色内容(视频缩略图/按钮)通常 <0.3。曾用 0.22 时,右下角一块
127×72 绿斑(绿色 3407px)以票数优势挤掉真时钟组,导致填错区域、
真时钟残留。任何「绿色票数更高」的单簇大绿斑都必须靠黑底占比拦下。
- 组间裁决(v1.2.3):UTCk3 显示屏必含「日期行+时间行」两行结构,
这是面板的确定性签名。深色页面上的大块绿色文字(如电影海报/视频帧里
的绿色发光标题)可通过全部单簇阈值(黑底占比实测可达 0.51)且绿色总数
更高(实测 1423 vs 真时钟 997),仅按绿色票数裁决会填错区域、真时钟
完整残留。规则:多组竞争时优先 ≥2 成员的组;同结构下先比黑底占比
(≥0.7 优先),再比绿色总数;仅当无两行结构组时才回退全组比绿色。
注意:该裁决只解决「多组竞争」,页面若只有假绿簇而无时钟仍会误填
(与旧版一致,属已知边界)。 - 定位(v1.2.2):以时间数字行为锚点还原完整面板矩形。
- 锚点选择(v1.2.2 关键修正):锚点 = 合并组内最底部子簇(即时间数字行)。
不能用「绿色像素最多」选锚点——JPEG 压缩偶发让日期行绿色数超过时间行,
误选日期行会使底部偏移整体上移约一个行高,状态行/KRISS 白条整条残留
(2026-09-11 用户实测反馈,161 张中 Annabelle com90 旧框底部少填 75px 即此因);
- 顶部:程序化检测标题栏窗框线(行灰度落差>18 且暗像素占比>0.25 的最上方
水平线),检测失败回退固定偏移 -93——防止贴顶面板外推吃掉浏览器工具栏;
- 左右(v1.2.2):取「固定标定偏移」与「窗框线暗行程检测」的并集
(外扩到两者最远端)。行程检测可能因窗框线变淡/×字符/JPEG 断裂提前停止,
导致左右偏短残留(右竖排按钮列、侧条残留);固定偏移是 v1.1 实测标尺,
二者取并集保证覆盖不低于任一单独方法。此前 v1.2.1 仅用行程检测,
161 张实测 117 张右侧偏短 4~190px、92 张左侧偏短 31~53px;
- 底部:数字 y1+95(v1.2.2 由 80 上调——部分截图状态行下方还有完整 KRISS 白条行);
- 阴影垫分方向:上 2 / 左 4 / 右 12 / 底 10 px,把 drop shadow 一并覆盖,
否则会勾出面板轮廓("看得出原本有个框"的主因之一);
- 偏移随锚点高度自适应缩放,兼容不同 DPI/缩放。 - 填补(模仿周围元素):
- 羽化策略(v1.2.0 关键修正):之前把渐变 alpha 放在面板矩形内部,
导致 KRISS 文字、窗框线以半透明残留在填充区中央——这是「仍像有个框」的根因。
v1.2.0 改为:面板矩形内部 100% 替换,仅在外侧环带做 1→0 羽化融合,
既消除面板本体,又与背景无缝衔接。
- blur(默认):取最优方向源块后做高斯模糊(核≈block×3)填入,
无块状纹理、无内容重复,适合大多数页面;复杂彩色页可能形成色晕。
- patch:四方向滑动窗口取同尺寸背景块,按
「边界连续性 L1 + 源块复杂度惩罚(Canny ×40)+ 方向先验(下方最优)」评分选最优,
线性外侧羽化 16px 融合覆盖。浅色/渐变页最隐形,但复杂页会复制出重复按钮/文字。
- mosaic:对源块像素化后填入,保留页面横向条带结构,但本身可见(有处理痕迹)。
- soft:原块与重度模糊按 0.55:0.45 混合,兼顾结构延续与低重复度。
- solid:源块中位色平铺 + 极轻噪声,适合纯色/浅色背景。
- 不要用泊松融合(seamlessClone):实测会把源块色调雾状扩散到整个填充区,
在浅色页面上产生明显灰雾斑块,比羽化更显眼;
- 兜底 shiftmap(内容感知填充)→ telea。 - 输出:JPEG 以 quality=95 + 4:4:4 无色度抽样写回,PNG 无损,最大限度保持取证画质。
用法
# 标准批量:处理文件夹,输出到 <文件夹>/no_utc/
<python> "<技能目录>/scripts/utc_frame_remover.py" "<输入文件夹>"
# 指定输出目录
... utc_frame_remover.py <输入文件夹> <输出目录>
# 只检测不修改(打印每张的面板坐标)
... utc_frame_remover.py <路径> --dry-run
# 递归处理 + 保持目录结构(输出镜像子目录、文件名不变)
# 注意:默认输出目录 <输入>/no_utc 在输入内部,递归时自动排除,不会把
# 上一轮输出当成新输入
... utc_frame_remover.py <输入根目录> <输出根目录> --recursive
# 只输出修改后图片(未检出时间框的不复制)
... utc_frame_remover.py <输入> <输出> --recursive --no-copy-missing
# 其他参数
--mode blur|patch|mosaic|soft|solid # 填充模式,默认 blur
--block N # mosaic/blur 块/核尺寸(默认 16)
--feather N # 外侧羽化像素(默认按模式自动)
--mix F # soft 模式原块与模糊的混合比(默认 0.55)
--no-fade # mosaic 关闭边缘细化(硬边马赛克)
--engine auto|shiftmap|telea # 兜底算法,默认 auto(shiftmap→telea)
--pad N # 兜底算法工作区边距(默认 64)
--quality N # JPEG 质量(默认 95)
--suffix S # 输出文件名后缀
--report F.csv # 追加写处理报告 CSV
--no-copy-missing # 未检出时间框的图片不复制到输出目录
必须使用技能自带 venv(含 opencv-contrib-python 5.0 + numpy 2.5 + pillow),
系统 Python 无 xphoto 模块。控制台输出前建议设 PYTHONIOENCODING=utf-8。
行为约定
- 不覆盖原图:默认输出到输入目录下的
no_utc/子目录;未检出时间框的图片
默认原样复制过去(保证批次完整,报告中标 SKIP)。 - 汇总输出:共 N 张 / 成功 / 未检出 / 失败 + 输出目录路径;每张打印面板坐标与所用算法。
- 退出码:0 全成功;2 未检出;3 有失败。
- 中文路径:读写均走
np.fromfile/imdecode+PIL,无需转义。
已验证
- 2026-09-04 v1.2.0,40 张真实取证截图:检测 40/40 唯一命中(百度网盘/知乎/抖音/B站/
lemonnx/nondo4u/9900205/mycbrn 等页面,分辨率 1704–1920,含贴顶/贴右缘变体)。 - 2026-09-11 v1.2.2,161 张 WARNER 批次重跑:用户反馈 3 类残留(右侧竖排按钮列、
底部状态行+KRISS 白条、左侧条带)→ 确定性 QA(新旧填充框比对)证实 161/161 张
旧版覆盖不足(left 92 / right 117 / bottom 161),修复后全量重跑 161/161 成功、
绿色特征残留扫描 0 命中、3 类残留代表图目检确认全覆盖。 - 2026-09-18 v1.2.3,86 张「去UTC」批次:递归 5 级嵌套(日期/Warner/Douyin/Feature/
片名)。首跑 86/86 后复扫发现 1 张 Oak Street (4) 填错区域(海报绿字 1423 票
击败真时钟 997 票)→ 加组间裁决(两行结构优先)→ 重跑 86/86,真时钟全清,
复扫唯一命中为画面内绿色发光字(页面内容,正确保留,属扫描器误报)。 - v1.1.0 修复:①右侧残留(窗框右沿实测 +190);②阴影勾框(分方向阴影垫);
③贴顶面板吃工具栏(窗框线检测);④灰雾(弃用泊松融合)。 - v1.2.0 新增:五种填充模式 + 羽化移到面板外侧(框内 100% 替换,外侧环带渐变),
解决了 KRISS/窗框线半透残留问题;默认模式改为blur。 - 速度:约 0.1–0.4 秒/张(1920×1000,blur/patch/mosaic 均很快;shiftmap 3–8 秒)。
- QA 方法论:白色 KRISS 条扫描误报率极高(页面白 UI 全命中,不可用);
有效 QA = ①确定性新旧填充框比对(覆盖不足=残留区)+ ②绿色特征复检 - ③对差异代表图做修复前/后裁剪拼接目检。
已知边界
- blur 默认:无块状纹理、无内容重复,但复杂彩色页可能把邻近 UI 色块晕开到填充区,
形成局部彩色光斑;如遇此情况可换--mode patch(浅色页最自然)或--mode solid。 - patch 模式:浅色/渐变页最隐形,但复杂页会复制出重复按钮/文字;
如需更高要求可改用--mode mosaic(结构保留但可见)或--mode blur。 - mosaic 模式:本质上会留下“被处理过”的可辨区域,适合想明确覆盖敏感内容,
不适合追求“完全看不出来”的取证场景。 - 面板下方/侧方紧邻大段文字或卡片时,填充内容与邻近元素高度相似,可能显得“复制粘贴”。
- 时钟被其他窗口遮挡一半、或截图仅截取时钟局部(无完整面板)时可能不命中。
- 时间框若被裁剪到只剩 LED 数字(无黑底完整框),锚点仍可命中,但面板偏移可能残留边框。
版本说明
- 1.2.5(2026-10-20):输出增加 UTF-8 编码兜底,中文 Windows 重定向下不再因中文/符号输出抛
UnicodeEncodeError;随包补LICENSE.txt。功能与 1.2.4 一致。