首页 > 其他分享 >opencv - py_photo - py_inpainting 图像修复

opencv - py_photo - py_inpainting 图像修复

时间:2024-12-12 12:28:43浏览次数:7  
标签:inpainting 修复 photo py 像素 算法 2001 图像 cv

文章目录

图像修复

目标

在本章中,

  • 我们将学习如何通过一种称为 修复 的方法去除旧照片中的小噪音、笔触等
  • 我们将看到 OpenCV 中的修复功能。

基础知识

你们大多数人家里都会有一些旧的劣化照片,上面有一些黑点、一些笔触等。你有没有想过把它恢复过来?我们不能简单地用绘画工具擦除它们,因为它只会用白色结构替换黑色结构,这是没用的。在这些情况下,使用一种称为图像修复的技术。基本思想很简单:用相邻像素替换那些坏标记,使其看起来像邻域。考虑下面显示的图像(取自[Wikipedia](http://en.wikipedia.org/wiki/Inpainting)):

在这里插入图片描述

为此目的设计了几种算法,OpenCV 提供了其中两种。这两种算法都可以通过同一个函数 cv.inpaint() 访问。

第一种算法基于 Alexandru Telea 于 2004 年发表的论文 “基于快速行进法的图像修复技术”。它基于快速行进法。考虑图像中要修复的区域。算法从该区域的边界开始,进入该区域,首先逐渐填充边界内的所有内容。它需要修复邻域中像素周围的一个小邻域。该像素被邻域中所有已知像素的归一化加权和替换。权重的选择很重要。靠近点、靠近边界法线和位于边界轮廓上的像素被赋予更大的权重。修复完一个像素后,它会使用快速行进法移动到下一个最近的像素。 FMM 确保首先修复已知像素附近的像素,因此它就像手动启发式操作一样工作。使用标志 cv.INPAINT_TELEA 启用此算法。

第二种算法基于 Bertalmio、Marcelo、Andrea L. Bertozzi 和 Guillermo Sapiro 于 2001 年发表的论文“Navier-Stokes、流体动力学以及图像和视频修复”。该算法基于流体动力学并利用偏微分方程。基本原理是启发式的。它首先沿着边缘从已知区域行进到未知区域(因为边缘应该是连续的)。它继续等光线(连接具有相同强度的点的线,就像轮廓连接具有相同高度的点一样),同时匹配修复区域边界处的梯度矢量。为此,使用了一些流体动力学方法。一旦获得它们,就会填充颜色以减少该区域的最小方差。该算法通过使用标志 cv.INPAINT_NS 来启用。

代码

我们需要创建一个与输入图像大小相同的蒙版,其中非零像素对应于要修复的区域。其他一切都很简单。我的图像被一些黑色笔触(我手动添加)损坏了。我用 Paint 工具创建了相应的笔触。

import numpy as np
import cv2 as cv

img = cv.imread('messi_2.jpg')
mask = cv.imread('mask2.png',0)

dst = cv.inpaint(img,mask,3,cv.INPAINT_TELEA)

cv.imshow('dst',dst)
cv.waitKey(0)
cv.destroyAllWindows()

参见下面的结果。第一张图显示降级的输入。第二张图是掩码。第三张图是第一个算法的结果,最后一张图是第二个算法的结果。
在这里插入图片描述

其他资源

  1. Bertalmio, Marcelo, Andrea L. Bertozzi 和 Guillermo Sapiro。“Navier-stokes、流体动力学和
    图像和视频修复。”《计算机视觉和模式识别》,2001 年。CVPR 2001。
    2001 年 IEEE 计算机学会会议论文集,第 1 卷,第 I-355 页。IEEE,2001 年。

  2. Telea, Alexandru。“基于快速行进方法的图像修复技术。”《图形工具杂志》9.1(2004 年):23-34。

练习

  1. OpenCV 附带一个关于修复的交互式示例,samples/python/inpaint.py,请尝试一下。

  2. 几个月前,我观看了一段关于 Content-Aware Fill 的视频,这是 Adob​​e Photoshop 中使用的一种高级修复技术。经过进一步搜索,我发现 GIMP 中已经存在相同的技术,只是名称不同,即“Resynthesizer”(您需要安装单独的插件)。我相信您一定会喜欢这项技术。

标签:inpainting,修复,photo,py,像素,算法,2001,图像,cv
From: https://blog.csdn.net/yuxing55555/article/details/143180331

相关文章

  • PySceneDetect指南
    安装:要开始,库中有一个高级函数可以对视频执行内容感知场景检测(尝试在Python提示符下运行):pipinstallscenedetect[opencv]--upgrade需要ffmpeg和mkvmerge以支持视频分割功能开始命令行快速开始在每个快速切换处分割输入视频:scenedetect-ivideo.mp4split-......
  • 高效文件处理:Python pathlib实战指南
    在使用Python处理文件路径时,强烈建议使用pathlib。pathlib以面向对象的方式处理文件路径,既避免了很多陷阱,也能使执行许多路径的相关操作变得更容易。本篇总结了常用的使用pathlib进行文件路径处理的方法。1.常用操作首先介绍如何使用pathlib来完成一些常规的文件路径相关操作......
  • PySide 信号与槽机制详解
    PySide信号与槽机制详解引言PySide是一个用于创建跨平台桌面应用程序的Python绑定库,它封装了Qt库的功能。Qt的核心特性之一是它的信号与槽(SignalsandSlots)机制,这是一种对象间通信的方法。在PySide中,这种机制允许开发者轻松地连接用户界面元素的行为和应用程序......
  • 使用python 语句编写一段程序,使用场景是检索本地电脑的.lic后缀的文件并且复制至一个
    你可以使用os模块来操作文件系统,并使用shutil模块来复制文件。下面是一个示例代码,可以实现你的需求:importosimportshutil#源文件夹路径source_folder='C:/path/to/source/folder'#目标文件夹路径destination_folder='C:/path/to/destination/folder'#遍历源......
  • 用python程序写一个爬虫小案例,使用场景输入手机号 获取验证码
    为了演示如何编写一个简单的爬虫来模拟“输入手机号并获取验证码”的场景,我们需要以下几个步骤:1.**分析目标网站**:首先,你需要找到一个可以通过手机号获取验证码的网站,并分析其网络请求。通常,验证码请求是通过`HTTPPOST`请求发送的,并带有手机号参数。2.**使用Python发......
  • Jupyter-Notebook 中误删单元格或代码、误剪切单元格的恢复方法
    1.恢复误删单元格场景:不小心Cut或删除了一个单元格,但没有关闭JupyterNotebook窗口。解决方法:进入命令模式(左侧蓝色边框):按下Esc键。按下键盘上的z键(撤销删除操作)。注意:仅限误删除的单元格(即使多次删除,也可以多次按z撤销)。不要按Ctrl+z,它用于撤销单元格内......
  • Python 批量修改文件/文件夹名
    Python批量修改文件/文件夹名1.简介:使用pythontkinter模块制作的一个界面化批量重命名文件以及文件夹的工具。资源已打包,大家可自行下载。功能升级:1.增加了多个文件选择的功能,并不需要一定选择文件夹。2.增加了保留源文件名功能,可以在源文件名基础上加数字字母。3.......
  • Python3 条件控制
    Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块。可以通过下图来简单了解条件语句的执行过程:代码执行过程:if语句Python中if语句的一般形式如下所示:ifcondition_1:statement_block_1elifcondition_2:statement_block_2else......
  • 基于遗传算法的梯级水电站群优化调度研究(Python代码实现)
     ......
  • Python学习笔记 - 探索列表与字典的特殊操作
    Python编程的核心数据结构之一是列表和字典。列表是一种可以存储有序数据的容器,而字典是一种通过键值对存储数据的结构。灵活运用列表与字典可以使代码更具可读性和高效性,尤其是在处理大量数据时。本教程将系统地介绍列表和字典的一些特殊操作,包括基本用法、应用实例,并讲解......