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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/14528.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字化转型的三个阶段:信息化、数字化、数智化

在当今快速迭代的数字时代,企业的生存与发展已与数字化转型浪潮紧密相连。数字化转型不仅是对传统业务模式的深度革新,更是企业适应未来市场、提升竞争力的关键路径。这一过程并非一蹴而就,而是循序渐进地分为信息化、数字化、数智化三个阶段…

Spring Boot篇

为什么要用Spring Boot Spring Boot 优点非常多,如: 独立运行 Spring Boot 而且内嵌了各种 servlet 容器,Tomcat、Jetty 等,现在不再需要打成 war 包部署到 容器 中,Spring Boot 只要打成一个可执行的 jar 包就能独…

Python----Python高级(网络编程:网络基础:发展历程,IP地址,MAC地址,域名,端口,子网掩码,网关,URL,DHCP,交换机)

一、网络 早期的计算机程序都是在本机上运行的,数据存储和处理都在同一台机器上完成。随着技术的发展,人 们开始有了让计算机之间相互通信的需求。例如安装在个人计算机上的计算器或记事本应用,其运行环 境仅限于个人计算机内部。这种设置虽然…

JAVA安全—FastJson反序列化利用链跟踪autoType绕过

前言 FastJson这个漏洞我们之前讲过了,今天主要是对它的链条进行分析一下,明白链条的构造原理。 Java安全—log4j日志&FastJson序列化&JNDI注入_log4j漏洞-CSDN博客 漏洞版本 1.2.24及以下没有对序列化的类做校验,导致漏洞产生 1.2.25-1.2.41增加了黑名单限制,…

Kubernetes架构原则和对象设计(三)

云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes常见问题解答 本文主要对kubernetes的核心技术概念和核心A…

每日学习 设计模式 五种不同的单例模式

狮子大佬原文 https://blog.csdn.net/weixin_40461281/article/details/135050977 第一种 饿汉式 为什么叫饿汉,指的是"饿" 也就是说对象实例在程序启动时就已经被创建好,不管你是否需要,它都会在类加载时立即实例化,也就是说 实例化是在类加载时候完成的,早早的吃…

Transformer 详解:了解 GPT、BERT 和 T5 背后的模型

目录 什么是 Transformer? Transformer如何工作? Transformer 为何有用? 常见问题解答:机器学习中的 Transformer 在技​​术领域,突破通常来自于修复损坏的东西。制造第一架飞机的人研究过鸟类。莱特兄弟观察了秃鹫如何在气流中保持平衡,意识到稳定性比动力更重要。…

21.2.6 字体和边框

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 通过设置Rang.Font对象的几个成员就可以修改字体,设置Range.Borders就可以修改边框样式。 【例 21.6】【项目&#xff…

1456. 定长子串中元音的最大数目

目录 一、题目二、思路2.1 解题思路2.2 代码尝试2.3 疑难问题 三、解法四、收获4.1 心得4.2 举一反三 一、题目 二、思路 2.1 解题思路 维护一个统计变量,出入时间窗口就判断 2.2 代码尝试 class Solution { public:int maxVowels(string s, int k) {int sum0;i…

[LeetCode]day16 242.有效的字母异位词

242. 有效的字母异位词 - 力扣(LeetCode) 题目描述 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的 字母异位词 示例 1: 输入: s "anagram", t "nagaram" 输出: true示例 2: 输入: s "rat"…

蓝桥杯---力扣题库第38题目解析

文章目录 1.题目重述2.外观数列举例说明3.思路分析(双指针模拟)4.代码说明 1.题目重述 外观数列实际上就是给你一串数字,我们需要对于这个数据进行一个简单的描述罢了; 2.外观数列举例说明 外观数列都是从1开始的,也…

Linux网卡配置方法

1、查看IP ip a 网卡状态 UP/down 2、查看网关 如果显示route命令未找到需要下载net-tools软件包 route -n 3、查看DNS服务器地址 DNS服务器地址会存放在/etc/resolv.conf文件中 使用cat命令可以查看 cat /etc/resolv.conf 4、修改网卡配置 方法1)编…

DeepSeek使用技巧大全(含本地部署教程)

在人工智能技术日新月异的今天,DeepSeek 作为一款极具创新性和实用性的 AI,在众多同类产品中崭露头角,凭借其卓越的性能和丰富的功能,吸引了大量用户的关注。 DeepSeek 是一款由国内顶尖团队研发的人工智能,它基于先进…

消费电子产品中的噪声对TPS54202的影响

本文章是笔者整理的备忘笔记。希望在帮助自己温习避免遗忘的同时,也能帮助其他需要参考的朋友。如有谬误,欢迎大家进行指正。 一、概述 在白色家电领域,降压转换器的应用非常广泛,为了实现不同的功能就需要不同的电源轨。TPS542…

无限使用Cursor

原理:运行程序获得15天的免费试用期,重新运行程序重置试用期,实现无限使用。免费的pro账号,一个月有250的高级模型提问次数。 前提:已安装cursor cursor-vip工具:https://cursor.jeter.eu.org?p95d60efe…

Linux之文件IO前世今生

在 Linux之文件系统前世今生(一) VFS中,我们提到了文件的读写,并给出了简要的读写示意图,本文将分析文件I/O的细节。 一、Buffered I/O(缓存I/O)& Directed I/O(直接I/O&#…

【计组】实验五 J型指令设计实验

目录 一、实验目的 二、实验环境 三、实验原理 四、实验任务 代码 一、实验目的 1. 理解MIPS处理器指令格式及功能。 2. 掌握lw, sw, beq, bne, lui, j, jal指令格式与功能。 3. 掌握ModelSim和ISE\Vivado工具软件。 4. 掌握基本的测试代码编写和FPGA开发板使用方法。 …

扩展知识--缓存和分时复用cpu

在多核CPU中,缓存和分时复用CPU是两个重要的概念,它们分别涉及硬件架构和资源管理策略。以下将从缓存的层次结构、工作原理以及分时复用CPU的概念进行详细解释。 一、多核CPU中的缓存 缓存的定义与作用 缓存(Cache)是位于CPU与主…

人工智能:从概念到未来

人工智能:从概念到未来 一、引言 在当今数字化时代,人工智能(Artificial Intelligence,AI)已从科幻小说和电影中的幻想逐渐走进现实,成为推动社会进步和经济发展的关键力量。它正在深刻地改变着我们的生活…

nvm:node 版本管理器

一、先安装git Git 安装完成后执行 git --version查看版本号是否安装成功 二、安装nvm (参考链接:mac 安装nvm详细教程 - 简书) 官网(https://github.com/nvm-sh/nvm/blob/master/README.md)查看最新版本安装命令 …