当前位置: 首页 > news >正文

OpenCV:图像修复

目录

简述

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

相关文章:

OpenCV:图像修复

目录 简述 1. 原理说明 1.1 Navier-Stokes方法(INPAINT_NS) 1.2 快速行进方法(INPAINT_TELEA) 2. 实现步骤 2.1 输入图像和掩膜(Mask) 2.2 调用cv2.inpaint()函数 2.3 完整代码示例 2.4 运行结果 …...

QT全局所有QSS样式实时切换

方法如下: void loadQss(int qssType) {QString name;if (qssType 1)name ":/qss/day.qss";elsename ":/qss/night.qss";QFile file(name);file.open(QFile::ReadOnly);QString qss;qss file.readAll();qApp->setStyleSheet(qss);file.…...

MySQL三大版本的演进

三大版本的演进 文章目录 三大版本的演进一:5.6版本(大跃进时期)1:支持只读事务2:innodb存储引擎增强2.1:缓冲池刷盘策略优化2.2:BufferPool缓冲池预热 3:新增Performance_Schema库监…...

利用 IMU 估计人体关节轴向和位置 —— 论文推导

Title: 利用 IMU 估计人体关节轴向和位置 —— “Joint axis and position estimation from inertial measurement data by exploiting kinematic constraints” —— 论文推导 文章目录 I. 论文回顾II. 铰接关节的约束1. 铰接关节约束的原理2. 铰接关节约束的梯度3. 铰接关节约…...

脚本一键生成管理下游k8s集群的kubeconfig

一、场景 1.1 需要管理下游k8s集群的场景。 1.2 不希望使用默认的cluster-admin权限的config. 二、脚本 **重点参数: 2.1 配置变量。 1、有单独namespace的权限和集群只读权限。 2、自签名的CA证书位置要正确。 2.2 如果配置错误,需要重新…...

数据库系统概念第六版记录 三

外码约束(Foreign Key Constraint) 外码(Foreign Key, FK)是关系数据库中的一个约束,它用于保证表之间的引用完整性。外码的值必须: 要么存在于被引用表的主键列中,要么为空(NULL&…...

YOLOv11-ultralytics-8.3.67部分代码阅读笔记-files.py

files.py ultralytics\utils\files.py 目录 files.py 1.所需的库和模块 2.class WorkingDirectory(contextlib.ContextDecorator): 3.def spaces_in_path(path): 4.def increment_path(path, exist_okFalse, sep"", mkdirFalse): 5.def file_age(path__fi…...

微信小程序案例1——制作猫眼电影底部标签导航栏

文章目录 一、项目步骤1 新建一个无AppID的movie项目2将准备好的底部标签导航图标拷贝到movie项目下面(将图标文件夹image放到项目文件夹里)3 打开App.json配置文件,在pages数组里添加4个页面路径:电影“pages/movie/movie”、影院“pages/cinema/cinema…...

【大数据技术】搭建完全分布式高可用大数据集群(Kafka)

搭建完全分布式高可用大数据集群(Kafka) kafka_2.13-3.9.0.tgz注:请在阅读本篇文章前,将以上资源下载下来。 写在前面 本文主要介绍搭建完全分布式高可用集群 Kafka 的详细步骤。 注意: 统一约定将软件安装包存放于虚拟机的/software目录下,软件安装至/opt目录下。 安…...

【服务器知识】如何在linux系统上搭建一个nfs

文章目录 NFS网络系统搭建**1. 准备工作****2. 服务器端配置****(1) 安装 NFS 服务****(2) 创建共享目录****(3) 配置共享规则****(4) 生效配置并启动服务****(5) 防火墙配置** **3. 客户端配置****(1) 安装 NFS 客户端工具****(2) 创建本地挂载点****(3) 挂载 NFS 共享目录***…...

图片画质增强:轻松提升画质

前言: 今天给大家推荐一款非常实用的图片画质增强软件,它无需联网即可使用,完全离线操作,这款软件基于先进的深度学习技术,能够对模糊图片进行强大的高清处理,效果令人惊艳。 图片画质增强:一…...

vscode快速接入deepseek 实践操作

背景说明 在deepseek快速火爆的情况下,也想自己体验一把。看看在vscode中集成进来,方便平时的脚本开发。对于年纪大的人还是非常方便的。 操作过程 安装continue 打开vscode进入扩展市场,搜索安装 安装完成就是上面的样子,会…...

mapbox进阶,添加绘图扩展插件,绘制圆形

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️MapboxDraw 绘图控件二、🍀添加绘图扩…...

Cursor 与多语言开发:全栈开发的利器

引言 全栈开发要求开发者跨越前端、后端、数据库甚至数据科学等多个技术领域,而不同技术栈往往需要切换工具和思维方式。Cursor 作为一款 AI 驱动的智能编程助手,凭借其对 20 编程语言 和主流框架的深度支持,正在成为全栈开发的“瑞士军刀”…...

2025 CCF BDCI|“基于TPU平台的OCR模型性能优化”一等奖作品

2024年12月,中国计算机学会在海南博鳌成功举办了第十二届CCF大数据与计算智能大赛(简称2024 CCF BDCI)。本届比赛的算能赛道吸引了1748名选手报名,经过激烈角逐,北京航空航天大学的“常务副SOTA”团队脱颖而出&#xf…...

FPGA的IP核接口引脚含义-快解

疑问 手册繁琐,怎样快速了解IP核各输入输出接口引脚的含义。 答疑 不慌不慌,手册确实比较详细但繁琐,如何快速知晓该部分信息,涛tao道长给你们说,简单得很,一般新入门的道友有所不知,往往后面…...

数据库高安全—审计追踪:传统审计统一审计

书接上文数据库高安全—角色权限:权限管理&权限检查,从权限管理和权限检查方面解读了高斯数据库的角色权限,本篇将从传统审计和统一审计两方面对高斯数据库的审计追踪技术进行解读。 4 审计追踪 4.1 传统审计 审计内容的记录方式通…...

机器学习 - 需要了解的条件概率、高斯分布、似然函数

似然函数是连接数据与参数的桥梁,通过“数据反推参数”的逆向思维,成为统计推断的核心工具。理解它的关键在于区分“参数固定时数据的概率”与“数据固定时参数的合理性”,这种视角转换是掌握现代统计学和机器学习的基础。 一、在学习似然函…...

Spring Boot Web 入门

目录 Spring Boot Web 是 Spring Boot 框架的一个重要模块,它简化了基于 Spring 的 Web 应用程序的开发过程。以下是一个 Spring Boot Web 项目的入门指南,涵盖了项目创建、代码编写、运行等关键步骤。 1. 项目创建 使用 Spring Initializr 使用 IDE …...

神经网络|(八)概率论基础知识-二项分布及python仿真

【1】引言 前序已经学习了古典概型、条件概率、全概率公式和贝叶斯公式,它们作为基础,解释了事件发生及其概率的对应关系,相关文章链接为: 神经网络|(四)概率论基础知识-古典概型-CSDN博客 神经网络|(五)概率论基础知识-条件概…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用

中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!

目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...

Linux基础开发工具——vim工具

文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...

路由基础-路由表

本篇将会向读者介绍路由的基本概念。 前言 在一个典型的数据通信网络中,往往存在多个不同的IP网段,数据在不同的IP网段之间交互是需要借助三层设备的,这些设备具备路由能力,能够实现数据的跨网段转发。 路由是数据通信网络中最基…...

js 设置3秒后执行

如何在JavaScript中延迟3秒执行操作 在JavaScript中,要设置一个操作在指定延迟后(例如3秒)执行,可以使用 setTimeout 函数。setTimeout 是JavaScript的核心计时器方法,它接受两个参数: 要执行的函数&…...