乐于分享
好东西不私藏

【音视频】iOS 一键去水印技术实现

【音视频】iOS 一键去水印技术实现

这个公众号会路线图式的遍历分享音视频技术:音视频基础 → 音视频工具 → 音视频工程示例 → 音视频工业实战。欢迎关注!

欢迎关注!音视频技术讨论和交流欢迎加群 ↓↓↓

这个系列文章我们来介绍一位海外工程师如何探索安卓音视频基础技术,对于想要开始学习音视频技术的朋友,这些文章是份不错的入门资料,本篇介绍音视频iOS 客户端高像素(12MP / 48MP)拍摄。

学习和提升音视频开发技术,推荐你加入我们的知识星球:【关键帧的音视频开发圈】,加入后你就能:

1)下载 30+ 个开箱即用的「音视频及渲染 Demo 源代码」

2)下载包含 500+ 知识条目的完整版「音视频知识图谱」

3)下载包含 200+ 题目的完整版「音视频面试题集锦」

4)技术和职业发展咨询 100% 得到回答

5)获得简历优化建议和大厂内推

现在加入,送你一张 20 元优惠券

扫码领取优惠券 👇👇👇


1、 核心原理

去水印本质上是:

  1. 获取 Mask(掩码):确定水印的位置(黑色背景,白色表示需要修复的区域)。
  2. 图像修复(Inpainting):根据掩码周围的像素纹理,通过算法填充掩码区域。

2、 方案一:使用原生 Core Image(快速实现)

这是无需集成庞大 AI 模型、利用系统内置算法的方案。

2.1、核心代码实现

import UIKitimport CoreImageimport CoreImage.CIFilterBuiltinsclassWatermarkRemover{/// 去除水印函数/// - Parameters:///   - inputImage: 原图///   - maskImage: 掩码图(水印部分为白色,其他为黑色)funcremoveWatermark(inputImage: UIImage, maskImage: UIImage) -> UIImage? {guardlet ciInput = CIImage(image: inputImage),let ciMask = CIImage(image: maskImage) else { returnnil }// 1. 创建修复滤镜// 注意:CIInpaintFilter 在某些 iOS 版本中可能需要通过名字加载letfilter = CIFilter(name: "CIInpaintFilter")filter?.setValue(ciInput, forKey: kCIInputImageKey)filter?.setValue(ciMask, forKey: "inputMaskImage")// 2. 获取输出guardlet outputCIImage = filter?.outputImage else { returnnil }// 3. 渲染回 UIImagelet context = CIContext(options: nil)iflet cgImage = context.createCGImage(outputCIImage, from: outputCIImage.extent) {returnUIImage(cgImage: cgImage)        }returnnil    }}

3、 方案二:集成深度学习模型(专业级效果)

如果你追求“无痕”效果,原生滤镜可能不够强大。推荐将 LaMa (Resolution-robust Large Mask Inpainting) 模型转换成 Core ML 接入。

3.1、步骤清单:

  1. 获取模型:从 GitHub 下载 LaMa 的 ONNX 模型。
  2. 转换格式:使用 coremltools 将其转换为 .mlpackage。
  3. 输入输出设计:
  • Input 1: 256x256 或 512x512 的原图。
  • Input 2: 相同尺寸的 Mask 图。
  • Output: 修复后的 Image。

3.2、Swift 集成伪代码:

// 假设你已经导入了转换好的 LaMa.mlpackagefuncapplyAIInpaint(image: UIImage, mask: UIImage) {let config = MLModelConfiguration()    config.computeUnits = .all // 开启神经引擎加速guardlet model = try? LaMaModel(configuration: config) else { return }// 将 UIImage 转为模型要求的 CVPixelBufferlet input = LaMaModelInput(image: image.toPixelBuffer(), mask: mask.toPixelBuffer())iflet prediction = try? model.prediction(input: input) {let resultImage = UIImage(pixelBuffer: prediction.outputImage)// 更新 UI    }}

4、 UI 交互:如何获取那张“掩码图”?

要实现“一键”或“涂抹”,你需要一个简单的绘图层:

  1. 涂抹模式:用户在 UIImageView 上手指涂抹水印区域,实时生成一张黑底白色的 UIImage 作为 Mask。
  2. 固定位置模式:如果你的业务场景是针对特定平台的视频水印(位置固定),可以直接代码生成一个矩形的 CIImage 掩码。

5、 开发建议

方案
优点
缺点
适用场景
Core Image
无需额外包体积,运行极快
复杂背景修复痕迹明显
简单背景、小面积水印
OpenCV Inpaint
算法成熟(FMM/NS)
需要集成 OpenCV 库 (C++)
通用型图像处理
AI (Core ML)效果惊艳,近乎无损
模型文件大(约 100MB+),有首帧延迟
专业修图 App、复杂场景

音视频技术交流和讨论,欢迎加入我们的微信群
扫码加入
谢谢看完全文,也点一下『赞』和『在看』吧 ↓

回首页,搜索你想要的文档

在首页搜索框输入关键词,快速定位资料

文库首页搜索指引 立即搜索

相关学习资料