OpenCV官方教程中文版 —— 图像修复
OpenCV官方教程中文版 —— 图像修复
- 前言
- 一、基础
- 二、代码
- 三、更多资源
前言
本节我们将要学习:
• 使用修补技术去除老照片中小的噪音和划痕
• 使用 OpenCV 中与修补技术相关的函数
一、基础
在我们每个人的家中可能都会几张退化的老照片,有时候上面不小心在上面弄上了点污渍或者是画了几笔。你有没有想过要修复这些照片呢?我们可以使用笔刷工具轻易在上面涂抹两下,但这没用,你只是用白色笔画取代了黑色笔画。此时我们就要求助于图像修补技术了。这种技术的基本想法很简单:使用坏点周围的像素取代坏点,这样它看起来和周围像素就比较像了。如下图所示(照片来自维基百科)

为了实现这个目的,科学家们已经提出了好几种算法,OpenCV 提供了其中的两种。这两种算法都可以通过使用函数 cv2.inpaint() 来实施。
第一个算法是根据 Alexandru_Telea 在 2004 发表的文章实现的。它是基于快速行进算法的。以图像中一个要修补的区域为例。算法从这个区域的边界开始向区域内部慢慢前进,首先填充区域边界像素。它要选取待修补像素周围的一个小的邻域,使用这个邻域内的归一化加权和更新待修复的像素值。权重的选择是非常重要的。对于靠近带修复点的像素点,靠近正常边界像素点和在轮廓上的像素点给予更高的权重。当一个像素被修复之后,使用快速行进算法(FMM)移动到下一个最近的像素。FMM 保证了靠近已知(没有退化的)像素点的坏点先被修复,这与手工启发式操作比较类似。可以通过设置标签参数为 cv2.INPAINT_TELEA 来使用此算法。
第二个算法是根据 Bertalmio,Marcelo,Andrea_L.Bertozzi, 和 Guillermo_Sapiro在 2001 年发表的文章实现的。这个算法是基于流体动力学并使用了偏微分方程。基本原理是启发式的。它首先沿着正常区域的边界向退化区域的前进(因为边界是连续的,所以退化区域非边界与正常区域的边界应该也是连续的)。它通过匹配待修复区域中的梯度向量来延伸等光强线(isophotes,由灰度值相等的点练成的线)。为了实现这个目的,作者是用来流体动力学中的一些方法。完成这一步之后,通过填充颜色来使这个区域内的灰度值变化最小。可以通过设置标签参数为 cv2.INPAINT_NS 来使用此算法。
二、代码
我们要创建一个与输入图像大小相等的掩模图像,将待修复区域的像素设置为 255(其他地方为 0)。所有的操作都很简单。我要修复的图像中有几个黑色笔画。我是使用画笔工具添加的。
# -*- coding: utf-8 -*-
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('messi_2.png')
mask = cv2.imread('mask2.png',0)
dst = cv2.inpaint(img,mask,3, cv2.INPAINT_NS)
dst2 = cv2.inpaint(img,mask,3, cv2.INPAINT_TELEA)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
dst = cv2.cvtColor(dst, cv2.COLOR_BGR2RGB)
dst2 = cv2.cvtColor(dst2, cv2.COLOR_BGR2RGB)
plt.figure()
plt.subplot(221),plt.imshow(img),plt.xticks([]), plt.yticks([]) # to hide tick values on X and Y axis
plt.subplot(222),plt.imshow(mask, cmap='gray'),plt.xticks([]), plt.yticks([]) # to hide tick values on X and Y axis
plt.subplot(223),plt.imshow(dst),plt.xticks([]), plt.yticks([]) # to hide tick values on X and Y axis
plt.subplot(224),plt.imshow(dst2),plt.xticks([]), plt.yticks([]) # to hide tick values on X and Y axis
plt.show()
结果如下。第一幅图是退化的输入图像,第二幅是掩模图像。第三幅是使用第一个算法的结果,最后一副是使用第二个算法的结果。

三、更多资源
- Bertalmio, Marcelo, Andrea L. Bertozzi, and Guillermo Sapiro.“Navier-stokes, fluid dynamics, and image and video inpainting.”In Computer Vision and Pattern Recognition, 2001. CVPR 2001. Proceedings of the 2001 IEEE Computer Society Conference on, vol. 1, pp. I-355. IEEE, 2001.
- Telea, Alexandru. “An image inpainting technique based on the fast marching method.”Journal of graphics tools 9.1 (2004): 23-34.
相关文章:
OpenCV官方教程中文版 —— 图像修复
OpenCV官方教程中文版 —— 图像修复 前言一、基础二、代码三、更多资源 前言 本节我们将要学习: • 使用修补技术去除老照片中小的噪音和划痕 • 使用 OpenCV 中与修补技术相关的函数 一、基础 在我们每个人的家中可能都会几张退化的老照片,有时候…...
前端难学还是后端难学?系统安全,web安全,网络安全是什么区别?
系统安全,web安全,网络安全是什么区别?三无纬度安全问题 系统安全,可以说是电脑软件的安全问题,比如windows经常提示修复漏洞,是一个安全问题 网页安全,网站安全,比如,…...
diffusers-Load pipelines,models,and schedulers
https://huggingface.co/docs/diffusers/using-diffusers/loadinghttps://huggingface.co/docs/diffusers/using-diffusers/loading 有一种简便的方法用于推理是至关重要的。扩散系统通常由多个组件组成,如parameterized model、tokenizers和schedulers,…...
私域营销必备:轻松掌握微信CRM管理方法
大家在微信私域营销中都遇到了什么问题? 比如管理时间不够,群发实效性低,自动回复无法适应变化等等。 我们可以利用微信CRM这个工具,轻松解决这些问题。 请问你们最想用这个工具解决什么问题呢? 使用微信CRM不仅可…...
最长回文子串-LeetCode5 动态规划
由于基础还不是很牢固 一时间只能想到暴力的解法: 取遍每个子串 总数量nn-1n-2…1 O(n^2) 判断每个子串是否属于回文串 O(n) 故总时间复杂度为O(n^3) class Solution { public:string longestPalindrome(string s) { int max0;string ret;for(int i0;i<s.size();i)for(int…...
mysql简单备份和恢复
版本:mysql8.0 官方文档 :MySQL :: MySQL 8.0 Reference Manual :: 7 Backup and Recovery 1.物理备份恢复 物理备份是以数据文件形式备份。这种方式效率高点,适合大型数据库备份。物理备份可冷备可热备。 使用mysqlbackup 命令进行物理备…...
JMeter介绍
1. JMeter是什么? 是Apache组织开发基于Java的接口测试工具,性能测试工具 2.JMeter的优缺点 优点: 开源,免费 跨平台 支持多协议 轻量级别 缺点: 不支持IP欺骗 不可验证页面UI 3.JMeter可以用来做什么? …...
flink job同时使用BroadcastProcessFunction和KeyedBroadcastProcessFunction例子
背景: 广播状态可以用于规则表或者配置表的实时更新,本文就是用一个欺诈检测的flink作业作为例子看一下BroadcastProcessFunction和KeyedBroadcastProcessFunction的使用 BroadcastProcessFunction和KeyedBroadcastProcessFunction的使用 1.首先看主流…...
数据中心系统解决方案
设计思路 系统设计过程中充分考虑各个子系统的信息共享要求,对各子系统进行结构化和标准化设计,通过系统间的各种联动方式将其整合成一个有机的整体,使之成为一套整体的、全方位的数据中心大楼综合管理系统,达到人防、物防和技防…...
服务器开设新账户,创建账号并设置密码
实验室又进新同学了,服务器开设新账号搞起来 1、创建用户: 在root权限下,输入命令useradd -m 用户名,如下 sudo useradd -m yonghuming 2、设置密码: 输入命令passwd 用户名 回车,接着输入密码操作&…...
【C++】关于构造函数后面冒号“:“的故事------初始化列表(超详细解析,小白一看就懂)
目录 一、前言 二、 初始化的概念区分 三、初始化列表 (重点) 💦初始化列表的概念理解 💦初始化列表的注意事项 四、共勉 一、前言 在之前的博客学习中,我们已经学习了【C】的六大默认成员函数 ,想必大…...
【Shell 系列教程】shell基本运算符(四)
文章目录 往期回顾关系运算符布尔运算符逻辑运算符字符串运算符文件测试运算符其他检查符: 往期回顾 【Shell 系列教程】shell介绍(一)【Shell 系列教程】shell变量(二)【Shell 系列教程】shell数组(三&am…...
MongoDB安装及开发系例全教程
一、系列文章目录 一、MongoDB安装教程—官方原版 二、MongoDB 使用教程(配置、管理、监控)_linux mongodb 监控 三、MongoDB 基于角色的访问控制 四、MongoDB用户管理 五、MongoDB基础知识详解 六、MongoDB—Indexs 七、MongoDB事务详解 八、MongoDB分片教程 九、Mo…...
ffmpeg命令帮助文档
一:帮助文档的命令格式 ffmpeg -h帮助的基本信息ffmpeg -h long帮助的高级信息ffmpeg -h full帮助的全部信息 ffmpeg的命令使用方式:ffmpeg [options] [[infile options] -i infile] [[outfile options] outfile] 二:将帮助文档输出到文件 …...
回归预测 | Matlab实现SO-CNN-SVM蛇群算法优化卷积神经网络-支持向量机的多输入单输出回归预测
Matlab实现SO-CNN-SVM蛇群算法优化卷积神经网络-支持向量机的多输入单输出回归预测 目录 Matlab实现SO-CNN-SVM蛇群算法优化卷积神经网络-支持向量机的多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.SO-CNN-SVM蛇群算法优化卷积神经网络-支持向量…...
【原创】java+swing+mysql校园共享单车管理系统设计与实现
摘要: 校园共享单车作为一种绿色、便捷的出行方式,在校园内得到了广泛的应用。然而,随着单车数量的增加,管理难度也不断加大。如何提高单车的利用率和管理效率,成为校园共享单车发展面临的重要问题。本文针对这一问题…...
(自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
(自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载 带后台系统PbootCMS内核开发的网站模板,该模板适用于新闻博客网站、自媒体运营网站等企业,当然其他行业也可以做,只需要把文字图片换成其他行业的即可&#…...
SystemC入门完整编写示例:全加器测试平台
导读: 本文将完整演示基于systemC编写一个全加器的测试平台。具体内容包括:激励平台,监控平台,待测单元的编写,波形文件读取。 1,main函数模块 搭建一个测试平台主要由:Driver, Monitor, DUT(design under …...
动手学深度学习:2.线性回归pytorch实现
动手学深度学习:2.线性回归pytorch实现 1.手动构造数据集2.小批量读取数据集3.定义模型和损失函数4.初始化模型参数5.小批量随机梯度下降优化算法6.训练完整代码Q&A 1.手动构造数据集 import torch from torch.utils import data from d2l import torch as d2l…...
重要的linux指令
系统管理命令 切换用户 su 用户名管理员身份运行 sudo 命令实时显示进程信息(linux下任务管理器) top查看进程信息(ps) ps -efps -ef | grep 进程名 ps -aux | grep 进程名参数说明e 显示所有进程f 全格式a 显示所有程序u 以用户为主的格式来显示程序状况x 显示无控制终端…...
终极免费Redis可视化工具:Windows版RedisDesktopManager完全指南
终极免费Redis可视化工具:Windows版RedisDesktopManager完全指南 【免费下载链接】RedisDesktopManager-Windows RedisDesktopManager Windows版本 项目地址: https://gitcode.com/gh_mirrors/re/RedisDesktopManager-Windows 你是否厌倦了在命令行中操作Red…...
Unity HDRP 2023.2水系统实战:从清澈泳池到湍急溪流,5分钟调出电影感水体
Unity HDRP 2023.2水系统实战:从清澈泳池到湍急溪流,5分钟调出电影感水体 在游戏和影视级实时渲染中,水体的表现力往往决定了场景的沉浸感上限。Unity 2023.2的HDRP Water Surface系统通过物理参数的艺术化组合,让开发者无需编写着…...
手把手教你给咪咕盒子MGV2000刷机,S905L3芯片也能焕发新生(保姆级图文教程)
让老旧咪咕盒子重获新生的全流程刷机指南 前言:为什么我们需要给电视盒子刷机? 家里那台运营商赠送的咪咕MGV2000电视盒子,是不是已经让你忍无可忍了?开机慢得像老牛拉车,操作卡顿到让人抓狂,内置应用一大…...
从手机充电到电路板:一文搞懂Type-C的6P、16P、24P到底该怎么选(附实物图对比)
Type-C接口选型实战指南:6P/16P/24P的工程决策逻辑 当你在设计一款智能手表时,是否曾纠结过该用6P还是16P的Type-C接口?这个问题看似简单,却直接影响着产品的BOM成本、用户体验和市场竞争力。作为硬件开发者,我们每天都…...
CentOS 8.5最小化安装实战:为什么我只选Minimal Install,以及后续必装的10个软件包
CentOS 8.5最小化安装实战:为什么我只选Minimal Install,以及后续必装的10个软件包 当你面对CentOS 8.5安装界面中那个看似简单的"Software Selection"选项时,是否曾犹豫过该选择哪个?作为一个经历过无数次系统安装的老…...
3个技巧让桌游卡牌设计效率提升5倍:EZCard自动化工具深度解析
3个技巧让桌游卡牌设计效率提升5倍:EZCard自动化工具深度解析 【免费下载链接】CardEditor 一款专为桌游设计师开发的批处理数值填入卡牌生成器/A card batch generator specially developed for board game designers 项目地址: https://gitcode.com/gh_mirrors/…...
如何在 Node.js 项目中快速使用 module-alias:10分钟入门教程
如何在 Node.js 项目中快速使用 module-alias:10分钟入门教程 【免费下载链接】module-alias Register aliases of directories and custom module paths in Node 项目地址: https://gitcode.com/gh_mirrors/mo/module-alias 在 Node.js 开发中,你…...
用YOLOv8和MMSegmentation实战:从血细胞检测到癌细胞分割(附完整代码)
医学影像实战:基于YOLOv8与MMSegmentation的细胞检测与分割全流程 在医疗影像分析领域,深度学习技术正逐步改变传统人工判读的低效模式。本文将带您完成两个典型医学影像任务的完整实现:使用YOLOv8进行血细胞检测分类,以及通过MMS…...
安装离线版mysql,全网最详细
CentOS7 离线安装 MySQL 5.7 完整版(一次装好、配置齐全、开机自启、远程访问、字符集、防火墙、环境变量、日志、权限全部搞定,零返工)适配你的服务器:CentOS Linux release 7.6.1810 x86_64,Java1.8 已就绪ÿ…...
STM32H7网络延迟问题分析与解决方案
1. 问题现象与背景分析最近在将STM32H7系列设备的DFP(Device Family Pack)从v2.2.0升级到v2.3.0版本后,不少开发者反馈网络数据传输出现了明显的延迟问题。通过简单的ping测试可以直观观察到,使用v2.3.0版本的往返时间(RTT)相比v2…...
