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

news/2024/12/5 9:51:07/

概念

修复是图像插值。数字修复算法在图像插值,照片恢复,缩放和超分辨率等方面具有广泛的应用。

大多数人会在家里放一些旧的退化照片,上面有一些黑点,一些笔画等。你有没有想过恢复它?我们不能简单地在绘画工具中擦除它们,因为它将简单地用白色结构替换黑色结构,这是没有用的。在这些情况下,使用称为图像修复的技术。基本思路很简单:用邻近的像素替换那些坏标记,使其看起来像是邻居(取自维基百科),考虑下面显示的图像:

库函数

dst = cv2.inpaint(src,mask, inpaintRadius,flags)

参数是:

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

实现

为此目的设计了几种算法,OpenCV提供了两种算法。两者都可以通过相同的函数访问,cv2.inpaint()。

第一种算法基于Alexandru Telea于2004年发表的“基于快速行进方法的图像修复技术”。它基于快速行进方法。考虑图像中要修复的区域。算法从该区域的边界开始,然后进入区域内,逐渐填充边界中的所有内容。它需要在邻近的像素周围的一个小邻域进行修复。该像素由邻居中所有已知像素的归一化加权和代替。选择权重是一个重要的问题。对于靠近该点的那些像素,靠近边界的法线和位于边界轮廓上的像素,给予更多的权重。一旦像素被修复,它将使用快速行进方法移动到下一个最近的像素。 FMM确保首先修复已知像素附近的像素,这样它就像手动启发式操作一样工作。使用标志cv2.INPAINT_TELEA启用此算法。

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

代码

我们需要创建一个与输入图像大小相同的掩码,其中非零像素对应于要修复的区域。其他一切都很简单。我的图像因一些黑色笔画而降级(我手动添加)。我用Paint工具创建了相应的笔触,同时得到mask。

import numpy as np
from matplotlib import pyplot as plt
import cv2img = cv2.imread('OpenCV_Logo_B.png')     # input
mask = cv2.imread('OpenCV_Logo_C.png',0)  # maskdst_TELEA = cv2.inpaint(img,mask,3,cv2.INPAINT_TELEA)
dst_NS = cv2.inpaint(img,mask,3,cv2.INPAINT_NS)plt.subplot(221), plt.imshow(img)
plt.title('degraded image')
plt.subplot(222), plt.imshow(mask, 'gray')
plt.title('mask image')
plt.subplot(223), plt.imshow(dst_TELEA)
plt.title('TELEA')
plt.subplot(224), plt.imshow(dst_NS)
plt.title('NS')plt.tight_layout()
plt.show()

这是原图文件和掩码文件:Pictures

输出:

这是输出。第一个是降级的OpenCV徽标,第二个图片是运行FMM所需的掩码。最后两张照片是修补的结果。不确定,但我认为两种修补方法之间没有任何区别,至少对于当前输入而言。

参考链接:
1、OpenCV Image Inpainting官方文档 https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_photo/py_inpainting/py_inpainting.html

2、https://www.bogotobogo.com/python/OpenCV_Python/python_opencv3_Image_reconstruction_Inpainting_Interpolation.php


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

相关文章

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通道图像。非零像素表示需要修复的…

cv2图像修补inpaint

本篇博客主要介绍cv2模块中的图像修补inpaint。 cv2中主要提供了两种进行图像修补的算法: 1、基于快速行进算法 cv2.INPAINT_TELEA。 2、基于流体动力学并使用了偏微分方程 cv2.INPAINT_NS。 代码: import cv2img = cv2.imread(../data/messi_2.jpg) mask = cv2.imread(…

Python,OpenCV中的图像修复——cv2.inpaint()

Python,OpenCV中的图像修复——cv2.inpaint 1. 效果图2. 原理3. 源码参考image inpainting 图像修改 这篇博客将介绍如何通过OpenCV中图像修复的技术——cv2.inpaint() 去除旧照片中的小噪音、笔划等。并提供一个可交互式的程序,利用OpenCV的快速行进和流体力学俩种修复算法对…

Inpaint 9 简体中文【订阅版+Win/Mac】

Inpaint 是一款强大的实用图片去水印软件,可从图片上去除不必要的物体,让您轻松摆脱图片上的水印、划痕、污渍、标志等瑕疵。 支持语言&#xff1a;简体中文 运行平台&#xff1a;Win7及以上&#xff0c;Mac10.13及以上 设备数量&#xff1a;授权1台设备 换机说明&#xff…

OpenCV每日函数 计算摄影模块(1) 图像修复算法 inpaint函数

一、概述 该算法使用区域邻域恢复图像中的选定区域。该功能可用于去除扫描照片上的灰尘和划痕,或去除静止图像或视频中不需要的物体。 二、inpaint函数 1、函数原型 void cv::inpaint (InputArray src, InputArray inpaintMask, OutputArray dst, double inpaintRadius, i…

Teorex Inpaint v9.0.1 图片去水印软件中文便携单文件免费版

推送到百度 Teorex Inpaint 中文正式版及解锁钥匙资源由亿破姐YPOJIE.COM网站精选收集互联网资源并整理相关Patch Crack KeyGen独家发布&#xff0c;Teorex Inpaint 是一款图片图形移除软件&#xff0c;如果你有照片不满意这时不需要大费周章的使用PS来做&#xff0c;只需要启动…