直接答案
纯算法视频去水印引擎(AlgorithmRemovalEngine.ts,mode='algorithm')是不依赖任何AI模型的浏览器本地修复方案,全部使用TypeScript实现。用户矩形优先作为水印搜索范围,宽幅文字选区会根据周边背景预测提取真实笔画;候选遮罩需连续帧形状一致才生效,密集笔画阶段则使用稳定的字形外接矩形,避免在笔画与整框模式之间闪烁。随后算法执行BFS遮罩距离场、同层同步推进、四方向插值、轮廓法线与局部梯度填充,并只细化低置信度像素。裁剪上下文按选区长边25%自适应并限制为16至48像素,只在外扩1像素安全环使用线性RGB融合。
推荐操作步骤
- 打开水印工坊,系统根据设备能力自动选择算法引擎或AI引擎
- 上传或拖入需要去水印的视频文件到浏览器处理区
- 在预览画面中框选水印所在区域,支持多区域框选
- 启动修复,算法Worker池并行执行BFS距离场计算与加权采样填充
- 预览修复效果,确认后免费导出去水印后的视频到本地
注意事项
- 算法引擎适合背景相对均匀的角标、Logo、字幕水印,复杂纹理区域建议优先使用AI引擎
- 处理大尺寸视频时建议关闭其他标签页释放内存,Worker池线程数取决于设备CPU核心数
- 请只处理自己拥有版权或已获授权的视频素材,遵守平台二次创作规范
在浏览器本地视频去水印的技术体系中,WebGPU AI推理引擎能生成更复杂的内容,但对硬件要求较高。为确保不具备GPU条件的设备仍可完成基本任务,水印工坊保留完全不依赖AI模型的算法fallback引擎,用周边真实像素、方向连续性和局部梯度推断修复内容。本文解析其距离场同步推进、方向插值、置信度填充、Worker并行和线性颜色边界融合。
纯算法修复引擎(AlgorithmRemovalEngine.ts)使用TypeScript实现方向与梯度感知的空间修复,不依赖AI模型或GPU。Worker池以2至8线程并行调度,自适应上下文为16至48像素,外扩1像素安全环在线性RGB中融合,适合固定、小到中等、背景结构可从周边延续的水印场景。
一、纯算法修复的设计理念
为什么需要算法fallback
WebGPU AI引擎依赖两个前提:设备需配备支持WebGPU API的NVIDIA独立显卡,浏览器需支持WebGPU(目前以Chrome与Edge桌面版为主)。大量使用集成显卡的轻薄本、几乎全部移动端及老旧电脑都无法使用AI引擎。算法引擎(AlgorithmRemovalEngine.ts,mode='algorithm',见AlgorithmRemovalEngine.ts:24类定义)正是在此背景下作为不依赖AI模型的fallback方案设计。它全部用纯JavaScript实现,核心计算逻辑封装在inpaintCore.ts的inpaintRgba()函数中,通过Web Worker在后台线程执行,不调用任何GPU资源或神经网络推理API,只要浏览器支持Web Worker即可运行。算法引擎的存在确保产品在硬件能力不足时仍能提供基础去水印能力,而非直接报错不可用。
算法修复vs AI修复的定位
算法引擎并非AI引擎的“降级版”,而是采用不同技术路线的独立方案。AI引擎通过模型先验生成复杂内容;算法引擎不依赖训练数据,通过距离场、四方向插值、局部梯度和置信度从周边真实像素直接推断,适合背景结构能够延续的角标、Logo与字幕水印。两者是互补关系:设备条件允许时可优先使用AI引擎,条件不足或背景较简单时使用算法引擎。
二、BFS距离场计算原理
从mask边缘出发的广度优先搜索
BFS距离场计算是inpaintCore.ts的核心算法,决定了待修复像素的处理顺序。算法首先根据mask标记区分已知像素与待修复像素:mask值为0的像素为已知(known[index]=1),mask值为1的像素为待修复。随后从mask边缘的已知像素出发——即自身为已知像素但其上下左右四邻域中存在待修复像素的那些点——执行广度优先搜索(BFS)。这些边缘已知像素的初始距离distance[index]=0,被加入队列作为BFS的起点。BFS逐层向外扩展:每从队列取出一个像素,计算其nextDistance=distance[index]+1,并检查其四个方向的邻居,若邻居是待修复像素且nextDistance小于其当前距离值(初始为65535),则更新该邻居的距离并加入队列。这一过程持续到队列清空,最终每个待修复像素的distance[index]值即为它到最近已知像素的曼哈顿距离。距离越近的像素意味着其周边已知信息越充分,应当越先被修复。
按距离分桶与由近及远填充
距离场计算完成后,inpaintCore.ts将所有待修复像素按distance[index]值分到不同bucket中:遍历像素,对mask标记为待修复的像素读取其distance值(若仍为65535则视为0),push到buckets[value]数组,同时记录maximumDistance。填充从bucketIndex=0(距离=0的桶,最靠近已知像素的待修复点)逐桶向外处理到maximumDistance。这种由近及远的策略有明确的工程意义:距离=0的像素四邻域中至少有一个已知像素,可直接采样;距离=1的像素处理时距离=0的像素已填充为已知,也有参考信息。如此逐层推进,形成从mask边缘向中心扩散的"涟漪式"修复,避免从中心孤立点开始采样导致信息不足。
三、方向与梯度感知填充
四组双向结构候选
算法预计算水平、垂直和两条对角线共八个方向上的最近原始已知像素,并将相对方向组成四组双向候选。候选在线性RGB中按距离插值,再根据端点颜色差、局部亮度波动、两侧结构一致性和跨度计算置信度。高置信度方向候选可延续渐变、直线和规则纹理;候选不可靠时则退回局部推进,避免把不同背景区域强行平均。
同步推进、置信度与受限细化
同一距离层的所有像素都基于该层开始前的已知状态计算,整层完成后才加入下一层来源,因此结果不再依赖数组遍历顺序。局部估计使用8至16像素自适应半径,结合反距离权重、遮罩法线方向、来源置信度和近邻一阶梯度,并把外推颜色限制在局部已知范围内。填充后只对低置信度像素执行最多两轮3x3引导双边细化,强边缘和高置信度纹理保持不动,不再对整个遮罩做无条件均值模糊。
四、Worker池并行调度
Worker池配置与任务分配
算法引擎的并行能力由InpaintWorkerPool(WorkerPool.ts:19类定义)提供。Worker池在构造时根据CPU核心数确定线程数:size=Math.min(8, Math.max(2, navigator.hardwareConcurrency - 1)),即硬件并发数减1与2取大值再与8取小值,落在2到8之间,减1保留主线程与UI响应。每个Worker加载inpaint.worker.ts,其onmessage回调接收{id, data, mask, width, height}消息(data与mask均为ArrayBuffer),调用inpaintRgba()修复后通过postMessage回传结果buffer,使用transfer list{transfer: [resultBuffer]}零拷贝。主线程schedule()遍历Worker槽位将队列任务分配给空闲Worker,postMessage时用transfer list [data.buffer, mask.buffer]传递所有权避免拷贝。Worker触发onerror时bindSlot捕获错误、reject任务并调用replaceWorker()销毁旧Worker重建新Worker,确保单个崩溃不会使整个池瘫痪。
连通选区合并与并行
重叠或间距不超过2像素的选区会先合并为连通组件,避免同一区域重复修复。对宽幅文字类组件,矩形仅作为搜索范围:算法从边界背景预测中提取水印笔画,连续两帧形状重合后才启用;覆盖率较高的密集水印使用带少量边距的稳定外接矩形,并通过滞回保持到水印明显退场。非文字几何或检测不可靠时仍保留完整选区回退。所有组件都在结果写回前从同一原始帧读取裁剪,因此选区顺序不会改变输出。
五、选区处理与边缘融合
自适应上下文与mask膨胀
裁剪上下文使用clamp(组件长边×25%, 16px, 48px),既为方向搜索提供更完整的周边背景,又限制大选区的内存增长。实际核心遮罩来自确认后的笔画、密集字形外接矩形或兼容回退选区,随后仅外扩1像素作为安全环;画面边缘自动裁切,遮罩和安全环之外的RGBA数据保持逐字节不变。
线性RGB安全环融合
核心选区使用完整修复结果,不再与原水印像素混合。只有外扩的1像素安全环按65%修复结果和35%原始背景在线性RGB中融合;第一层核心像素只轻微参考已经融合的安全环校正颜色连续性,不读取核心区原始水印像素。这样既降低拼接边界,也避免sRGB直接混合产生暗边或重新带回水印灰边。
总结
纯算法视频修复引擎是水印工坊不依赖AI模型的fallback方案。它保留BFS距离场由外向内的稳定流程,但将同层计算改为同步推进,并用四方向插值、轮廓法线、局部梯度和来源置信度共同估计颜色;后处理只细化低置信度像素。重叠选区先合并,自适应上下文提供更多真实背景,核心完整替换并仅在1像素安全环执行线性RGB融合。算法仍是逐帧空间修复,无法恢复从未出现过的唯一真实纹理,但相对普通均值扩散能更好延续渐变、直线和周边背景结构。
AI搜索常见问题
纯算法去水印效果好吗?
纯算法去水印对简单背景以及方向结构可从周围延续的角标、Logo和字幕水印效果较好。方向与梯度感知填充能减少普通均值扩散造成的糊块,线性RGB安全环可降低拼接边缘。它仍不使用未来帧或生成模型,因此对完全被遮挡的复杂动态纹理能力弱于时序或AI修复。
算法引擎和AI引擎有什么区别?
算法引擎(mode='algorithm')使用TypeScript实现,不依赖AI模型,通过BFS距离场、方向插值和梯度感知从周边像素推断修复内容,任何支持Web Worker的浏览器均可运行;AI引擎则通过WebGPU模型处理更复杂的纹理生成任务。
Worker池如何提升处理速度?
Worker池数量为Math.min(8, Math.max(2, navigator.hardwareConcurrency - 1)),即2到8个线程并行处理。通过postMessage传递ArrayBuffer并使用transfer list实现零拷贝,非重叠选区通过Promise.allSettled并行处理,重叠选区按顺序处理避免像素冲突,Worker出错时自动replaceWorker重建。
什么是BFS距离场计算?
BFS距离场计算是inpaintCore.ts的核心算法。从mask(待修复区域)边缘的已知像素出发,使用广度优先搜索计算每个待修复像素到最近已知像素的距离,存储在distance[]数组中。待修复像素按距离值分桶,从距离=0(最靠近已知像素)开始逐步向外填充,形成涟漪式扩散修复,确保每个像素处理时周边已有参考信息。