OpenCV:图像修复

embedded/2025/2/8 16:30:34/

目录

简述

1. 原理说明

1.1 Navier-Stokes方法(INPAINT_NS)

1.2 快速行进方法(INPAINT_TELEA)

2. 实现步骤

2.1 输入图像和掩膜(Mask)

2.2 调用cv2.inpaint()函数

2.3 完整代码示例

2.4 运行结果

3. 掩膜制作方法

4. 差异

4.1 修复效果

4.2 计算效率

5. 总结


简述

在 OpenCV 中,图像修复是一种用于去除图像中不需要的部分(如划痕、污渍等)的技术。OpenCV 提供了两种主要的图像修复算法:基于流体动力学的图像修复方法(Navier-Stokes,NS)和基于快速行进算法(Fast Marching Method,FMM)的修复方法。


1. 原理说明

cv2.inpaint() 基于两种算法:

1.1 Navier-Stokes方法(INPAINT_NS)

  • 通过流体动力学模拟,沿等照度线(颜色梯度方向)传播信息。
  • 适合修复自然纹理,但计算速度较慢。

1.2 快速行进方法(INPAINT_TELEA)

  • 基于像素邻域的加权平均,优先修复边界附近的区域。
  • 速度更快,适合实时处理。

2. 实现步骤

2.1 输入图像和掩膜(Mask)

  • 原始图像:待修复的图片(需为uint8格式)。
  • 掩膜图像:标记需修复区域的二值图像(白色区域为需修复部分)。

2.2 调用cv2.inpaint()函数

inpainted_img = cv2.inpaint(src, mask, inpaintRadius, flags)
  •  src:输入图像(BGR格式)。
  • mask:掩膜图像(单通道,非零像素表示需修复区域)。
  • inpaintRadius:修复半径(影响周围像素的范围,通常设为3-5)。
  • flags:选择算法(cv2.INPAINT_NS 或 cv2.INPAINT_TELEA)。

2.3 完整代码示例

import cv2
import numpy as np# 读取原始图像和掩膜
image = cv2.imread("D:\\resource\\opencv\\lena_damaged1.png")# 掩膜需为单通道
mask = cv2.imread("D:\\resource\\opencv\\mask1.png", cv2.IMREAD_GRAYSCALE)  # 检查图像是否读取成功
if image is None or mask is None:print("Error: image or mask is none !")exit()# 图像修复
inpainted_telea = cv2.inpaint(image, mask, inpaintRadius=3, flags=cv2.INPAINT_TELEA)
# inpainted_ns = cv2.inpaint(image, mask, inpaintRadius=3, flags=cv2.INPAINT_NS)# 显示结果
cv2.imshow("image", image)
cv2.imshow("mask", mask)
cv2.imshow("Inpainted (TELEA)", inpainted_telea)
# cv2.imshow("Inpainted (NS)", inpainted_ns)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.4 运行结果

原图: 

mask:

TELEA:

注意事项:

  1. 掩膜必须为单通道二值图像(0表示正常区域,非0表示需修复区域)。

  2. 修复区域周围需有足够的信息供算法参考,否则效果可能不理想。

  3. 对于复杂场景(如大面积修复),建议结合深度学习模型(如DeepFill、GAN)。


3. 掩膜制作方法

若没有掩膜图像,可通过以下方式生成:

  • 手动标注(如用画图工具标记需修复区域为白色)。
  • 程序生成(例如通过阈值分割或边缘检测):
# 示例:通过颜色阈值生成掩膜(假设修复红色区域)
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
lower_red = np.array([0, 50, 50])
upper_red = np.array([10, 255, 255])
mask = cv2.inRange(hsv, lower_red, upper_red)

4. 差异

4.1 修复效果

cv2.INPAINT_TELEA:

  • 修复后的图像通常具有较好的平滑性,在处理小面积的噪声、划痕等损坏时,能够快速生成视觉上较为自然的结果。它对于简单的图像修复任务表现出色,能够有效地去除小瑕疵,使图像看起来更加干净。
  • 然而,在处理大面积的缺失区域或具有复杂结构的图像时,可能会出现模糊或丢失细节的问题,因为它更侧重于平滑性,可能会过度平滑图像中的一些重要特征。

cv2.INPAINT_NS:

  • 该算法在保留图像的结构信息方面表现更优,尤其适用于修复包含重要线条、纹理或边缘的图像。它能够更好地保持图像的原有结构,使得修复后的区域与周围环境更加融合。
  • 但在某些情况下,修复结果可能会显得不够平滑,特别是在处理一些颜色变化较为剧烈的区域时,可能会出现一些轻微的块状效应。

4.2 计算效率

cv2.INPAINT_TELEA:

  • 由于其基于快速行进算法,计算速度相对较快。它在处理小规模的修复任务时能够迅速给出结果,对于实时性要求较高的应用场景更为适用。

cv2.INPAINT_NS:

  • 该算法需要求解较为复杂的偏微分方程,计算量相对较大,因此处理速度较慢。在处理大尺寸图像或需要修复大面积区域时,可能会花费较多的时间。

5. 总结

在实际应用中选择使用 cv2.INPAINT_TELEA 还是 cv2.INPAINT_NS 可以从以下几个方面进行考虑: 

考虑因素选择 cv2.INPAINT_TELEA 的情况选择 cv2.INPAINT_NS 的情况
修复区域特征小面积、简单瑕疵修复,如轻微划痕、小斑点、孤立噪声点大面积、复杂结构修复,图像含明显线条、纹理、边缘
对图像细节和结构的要求追求平滑效果,不太在意细微结构变化注重细节保留,图像细节信息重要
计算资源和时间限制实时性要求高的场景,如实时视频流修复计算资源充足且不考虑时间成本,如珍贵文物图像离线修复

http://www.ppmy.cn/embedded/160571.html

相关文章

三格电子-单串口服务器说明

一、产品介绍 1.1 功能简介 SG-TCP232-110 是一款用来进行串口数据和网口数据转换的设备。解决普通 串口设备在 Internet 上的联网问题。 设备的串口部分提供一个 232 接口和一个 485 接口,两个接口内部连接,同 时只能使用一个口工作。 设 备 的网 口…

Unity 简易的UI框架

核心内容 UIType.cs namespace MYTOOL.UI {/// <summary>/// UI层级/// </summary>public enum UILayer{/// <summary>/// 主界面层/// </summary>MainUI 0,/// <summary>/// 普通界面层/// </summary>NormalUI 1,/// <summary>/…

C语言:函数栈帧的创建和销毁

目录 1.什么是函数栈帧2.理解函数栈帧能解决什么问题3.函数栈帧的创建和销毁的过程解析3.1 什么是栈3.2 认识相关寄存器和汇编指令3.3 解析函数栈帧的创建和销毁过程3.3.1 准备环境3.3.2 函数的调用堆栈3.3.3 转到反汇编3.3.4 函数栈帧的创建和销毁 1.什么是函数栈帧 在写C语言…

Hypium+python鸿蒙原生自动化安装配置

Hypiumpython自动化搭建 文章目录 Python安装pip源配置HDC安装Hypium安装DevEco Testing Hypium插件安装及使用方法​​​​​插件安装工程创建区域 Python安装 推荐从官网获取3.10版本&#xff0c;其他版本可能出现兼容性问题 Python下载地址 下载64/32bitwindows安装文件&am…

osclass增加支持webp格式

1、basic_data.sql 数据表&#xff1a;t_preference中的(osclass, allowedExt, png,gif,jpg,jpeg, STRING)&#xff0c;添加&#xff1a;png,gif,jpg,jpeg,webp 2、includes/osclass/mimes.php webp > image/webp, 3、includes/osclass/classes/ImageProcessing.php 修…

科技快讯 | 领英“隐私风波”告一段落;华为余承东智驾 1345 公里返工,称智界 R7 打赢“鸡蛋保卫战”;谷歌翻译将增“提问”功能

谷歌安卓 16 快捷设置被曝告别悬浮窗&#xff0c;选项在面板内展开 科技媒体Android Authority于1月30日发布博文&#xff0c;称谷歌安卓16更新中&#xff0c;快捷面板&#xff08;Quick Setting&#xff09;功能可能回归旧版样式。当前安卓版Quick Setting点击磁贴会扩展为浮动…

Mysql系列之--字符集

1、字符集 1.1、字符集简介 我们知道在计算机中只能存储二进制&#xff0c;那么如何将字符存储到计算机中&#xff0c;这个时候就需要将字符映射称为二进制&#xff0c;将所有字符映射为二进制就需要映射表。建立映射表需要注意&#xff1a; 1、明确哪些字符需要映射为二进制…

zzcms index.php存在SQL注入漏洞

免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…