opencv cv2.inpaint()的代码与理论

news/2024/12/5 2:23:56/

Python-OpenCV中的cv2.inpaint()函数

import numpy as np
import cv2img = cv2.imread('messi_2.jpg') #待修复图像
mask = cv2.imread('mask2.png',0)# 8位1通道掩码图像dst = cv2.inpaint(img,mask,inpaintRadius=6,flags=cv2.INPAINT_NS)
或
dst = cv2.inpaint(img,mask,inpaintRadius=6,flags=cv2.INPAINT_TELEA)cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

理论基础

CVPR 2001 Navier-Stokes, Fluid Dynamics, and Image and Video Inpainting

在这里插入图片描述
在这里插入图片描述

dst = cv2.inpaint(src,mask, inpaintRadius,flags)
- src:输入8位1通道或3通道图像。
- inpaintMask:修复掩码,8位1通道图像。非零像素表示需要修复的区域。
- dst:输出与src具有相同大小和类型的图像。
- inpaintRadius:算法考虑的每个点的圆形邻域的半径。
- flags:INPAINT_NS基于Navier-Stokes的方法Alexandru Telea的INPAINT_TELEA方法

Bertalmio,Marcelo,Andrea L. Bertozzi和Guillermo Sapiro于2001年撰写的“Navier-Stokes,流体动力学和图像和视频修补”一文。该算法基于流体动力学并利用偏微分方程。基本原则是heurisitic。它首先沿着已知区域的边缘行进到未知区域(因为边缘是连续的)。它继续等照片(连接具有相同强度的点的线,就像轮廓连接具有相同高度的点一样),同时在修复区域的边界处匹配渐变矢量。为此,使用来自流体动力学的一些方法。获得颜色后,填充颜色以减少该区域的最小差异。使用标志cv2.INPAINT_NS启用此算法。

图像修复涉及使用周围区域的信息填充部分图像或视频。应用包括修复损坏的照片和电影以及移除选定的对象。本文介绍了一类数字修复的自动化方法。该方法利用经典流体动力学的思想,将等照度线从外部连续传播到待修复区域。其主要思想是将图像强度视为二维不可压缩流的“流函数”。图像强度的拉普拉斯函数起着流体涡度的作用;
它被传输到由流函数定义的向量场来修复的区域。所得到的算法被设计为在匹配修复区域边界处的梯度向量的同时继续等照度图。
该方法直接基于流体动力学的Navier-Stokes方程,具有理论和数值结果成熟的直接优势。这是一种将计算流体力学的思想引入计算机视觉和图像分析问题的新方法。

An ImageInpainting Technique Based On the Fast Marching MethodJanuary( 2004Journal of Graphics Tools)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
现在假设p点是我们要修复的像素。以p为中心选取一个小邻域B(ε),该邻域中的点像素值都是已知的(只要已知的)。(这个ε就是opencv函数中参数 inpaintRadius)

一点的恢复公式

q为 Bε(p)中的一点,由q点计算P的灰度值公式如下:
I q ( p ) = I ( q ) + ∇ I ( q ) ( p − q ) (1) I_q(p)=I(q)+\nabla I(q)(p-q) \tag{1} Iq(p)=I(q)+I(q)(pq)(1)

全局的恢复公式需要用w加权

I ( p ) = ∑ q ∈ B ( ε ) w ( p , q ) ⋅ I q ( p ) ∑ q ∈ B ( ε ) w ( p , q ) (2) I(p)=\frac{\sum_{q\in B(ε)}w(p,q) \cdot I_q(p)}{\sum_{q\in B(ε)}w(p,q)} \tag{2} I(p)=qB(ε)w(p,q)qB(ε)w(p,q)Iq(p)(2)
其中权重:
w ( p , q ) = d i r ( p , q ) ⋅ d s t ( p , q ) ⋅ l e v ( p , q ) w(p, q) = dir(p, q) · dst(p, q) · lev(p, q) w(p,q)=dir(p,q)dst(p,q)lev(p,q)
在这里插入图片描述

图像的恢复过程

δΩi = boundary of region to inpaint//修复区域的边缘
δΩ = δΩi
while (δΩ not empty)
{p = pixel of δΩ closest to δΩi//修复距离边缘最近的像素inpaint p using Eqn.2//利用公式2修复p点advance δΩ into Ω//把边缘向里行进
}

FMM论文地址
参考:https://zhuanlan.zhihu.com/p/365677164

参考与更多

OpenCV-Python教程:57.图像修复

Chan T, Shen J. Local inpainting models and TV inpainting
I ( u ) = ∬ Ω ∣ ∇ u ( x , y ) ∣ d x d y I(u)=\iint _{\Omega} |\nabla u(x,y)|dxdy I(u)=Ω∣∇u(x,y)dxdy

Ω是待修复区域,目的是求出使这个泛函取得最小值的函数u(x,y,t)
用的是欧拉-拉格朗日方法,求得梯度流为 :

∂ u ∂ t = d i v [ ∇ u ∣ ∇ u ∣ ] \frac{\partial u}{\partial t}=div[\frac{\nabla u}{|\nabla u|}] tu=div[∣∇uu]
解释


http://www.ppmy.cn/news/466962.html

相关文章

inpaint-图像修补算法

图像的修补技术由inpaint函数实现,它可以用来从扫描的照片中清除灰尘和划痕,或者从静态图像或视屏中去除不需要的物体。 函数原型C: void inpaint( InputArray src, InputArray inpaintMask, OutputArray dst,double inpaintRadius, int flags )1&#…

学习|OpenCV图片修复函数inpaint

学更好的别人, 做更好的自己。 ——《微卡智享》 本文长度为2020字,预计阅读6分钟 OpenCV图片修复 最近重新学习OpenCV的基础,偶然间发现了npaint的函数,于是就自己做了Demo测试了下,感觉还不错,这篇就来分…

opencv-图像修补,图像修复,inpaint

//---------------------------------【头文件、命名空间包含部分】---------------------------- // 描述:包含程序所使用的头文件和命名空间 //------------------------------------------------------------------------------------------------ #include &qu…

图片去水印Inpaint5.2汉化破解便携版

Inpaint是一款照片修复工具,用来去除照片中的瑕疵,在网上下载的一些图片通常都会有网站LOGO,可以利用Inpaint除去照片中的LOGO,Inpaint采用最新的的算法能自动计算图像中相邻区域的颜色分布,利用周围的背景色自动填充所…

【Python】OpenCV中的cv2.inpaint()函数

概念 修复是图像插值。数字修复算法在图像插值,照片恢复,缩放和超分辨率等方面具有广泛的应用。 大多数人会在家里放一些旧的退化照片,上面有一些黑点,一些笔画等。你有没有想过恢复它?我们不能简单地在绘画工具中擦…

Mac图片去水印软件Teorex Inpaint值得推荐的五大理由

如果你的图片中有一些不满意的瑕疵,比如旅游照片中乱入的游客?照片中烦人的水印?想修复多年前的老照片?不必动用庞大ps来兴师动众,只需使用InpAInt即可轻松搞定。Teorex InpAInt 是Mac平台上一款专业的去图片水印/瑕疵…

OpenCV3之——图像修补inpaint()函数

#include <opencv2/opencv.hpp> #include <iostream> using namespace std; using namespace cv;#define WINDOW_NAME1 "原始图" #define WINDOW_NAME2 "修补后的效果图"Mat srcImage1, inpaintMask; Point previousPoint(-1, -1);//初始坐标s…

通过opencv的函数进行图片修复:cv2.inpaint()

库函数使用&#xff1a; dst cv2.inpaint&#xff08;src&#xff0c;mask, inpaintRadius&#xff0c;flags&#xff09; 参数是&#xff1a; src&#xff1a;输入8位1通道或3通道图像。inpaintMask&#xff1a;修复掩码&#xff0c;8位1通道图像。非零像素表示需要修复的…