OpenCV 提供了两种经典的图像修复(Inpainting)算法,专门用于去除图像中的划痕、污渍、水印或不需要的物体。这两种算法都基于传统图像处理技术,通过利用待修复区域周围的已知像素信息来推断并填充缺失部分,非常适合处理小面积破损。
核心算法对比
OpenCV 的cv2.inpaint()函数支持两种算法,它们各有侧重:
| 特性 | cv2.INPAINT_TELEA(快速行进法) | cv2.INPAINT_NS(Navier-Stokes) |
|---|---|---|
| 核心原理 | 基于快速行进算法 (FMM),从边界向中心填充,使用邻域像素的加权平均。 | 基于流体动力学,模拟等照度线传播,保持边缘和梯度连续性。 |
| 修复效果 | 平滑性好,适合简单纹理和小瑕疵,但大面积修复易模糊。 | 结构保持性好,适合复杂边缘和线条,但可能不够平滑。 |
| 计算速度 | 快,适合实时处理。 | 较慢,计算量较大。 |
| 适用场景 | 小面积噪声、划痕、细小遮挡物。 | 包含重要线条、纹理或复杂结构的区域。 |
实战代码
1. 基础修复流程
使用 OpenCV 进行图像修复需要三个要素:原始图像、二值掩码(Mask)和修复半径。
importcv2importnumpyasnpdefopencv_inpaint(image_path,mask