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

目录
  • 概念
  • 库函数
  • 实现
  • 代码

概念

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

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

库函数

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方法

实现

为此目的设计了几种算法,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 cv2

img = cv2.imread('OpenCV_Logo_B.png')     # input
mask = cv2.imread('OpenCV_Logo_C.png',0)  # mask

dst_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

到此这篇关于Python-OpenCV中的cv2.inpaint()函数的使用的文章就介绍到这了,更多相关OpenCV cv2.inpaint()函数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 对python opencv 添加文字 cv2.putText 的各参数介绍

    如下所示: cv2.putText(img, str(i), (123,456)), font, 2, (0,255,0), 3) 各参数依次是:图片,添加的文字,左上角坐标,字体,字体大小,颜色,字体粗细 其中字体可以选择 FONT_HERSHEY_SIMPLEX Python: cv.FONT_HERSHEY_SIMPLEX normal size sans-serif font FONT_HERSHEY_PLAIN Python: cv.FONT_HERSHEY_PLAIN small s

  • Python-OpenCV:cv2.imread(),cv2.imshow(),cv2.imwrite()的区别

    目录 为什么使用Python-OpenCV? 基本操作 1.图像读入 2.显示图片 3.保存图片 变换操作 1.翻转图片 2.复制图片 3.颜色空间转换 4.裁剪图片 综合示例 参考链接: 为什么使用Python-OpenCV? 虽然python 很强大,而且也有自己的图像处理库PIL,但是相对于OpenCV 来讲,它还是弱小很多.跟很多开源软件一样OpenCV 也提供了完善的python 接口,非常便于调用.OpenCV 的最新版是4.0,包含了超过2500 个算法和函数,几乎任何一个能想到的

  • Opencv2.4.13与Visual Studio2013环境搭建配置教程

    opencv这个工具来进行图像处理.大致是使用C++语言编写程序实现识别算法的实现,所以首先就要进行opencv与VS环境的配置. Shaine属于那种半路出家之人都算不上的那种,本科期间三四年来学习的真是半吊子,开发方向的东西完全就是一窍不通.而作为一个giser,不可避免的会涉及到开发,也免不了图形图像处理的东西,所以,Shaine打算借着毕设这个机会,自己独自着手一个小项目,从需求.现有研究状况.可引用的经典算法等开始,重学GIS开发,初步学习opencv相关内容. 之前花了四五天的时间来

  • python-opencv 中值滤波{cv2.medianBlur(src, ksize)}的用法

    python-opencv 中值滤波{cv2.medianBlur(src, ksize)} 中值滤波将图像的每个像素用邻域 (以当前像素为中心的正方形区域)像素的 中值 代替 .与邻域平均法类似,但计算的是中值 #用中值法 for y in xrange(1,myh-1): for x in xrange(1,myw-1): lbimg[y,x]=np.median(tmpimg[y-1:y+2,x-1:x+2] 下面调用opencv的函数 # -*- coding: utf-8 -*- #c

  • Python OpenCV之图片缩放的实现(cv2.resize)

    OpenCV函数原型: cv2.resize(InputArray src, OutputArray dst, Size, fx, fy, interpolation) 参数解释: InputArray src 输入图片 OutputArray dst 输出图片 Size 输出图片尺寸 fx, fy 沿x轴,y轴的缩放系数 interpolation 插入方式 interpolation 选项所用的插值方法: INTER_NEAREST 最近邻插值 INTER_LINEAR 双线性插值(默认设置

  • visual studio 2015+opencv2.4.13配置教程

    换实验室啦,换电脑啦,重新配置开发环境,正好这个系列缺一篇完整的配置教程,索性在中途补上.可能会造成这个系列排版变乱!!!这次配置选择的事visual studio2015和opencv2.4.13.至于不配置opencv3.1是因为opencv3.1中的nonfree库需要自己下载,而且当前大部分项目都是基于opencv2.4系列开发的,没必要追求最新.在了解了opencv一些基本用法之后,至于使用哪个版本的opencv就不再是问题. 1.下载 首先给出visual studio 2015和o

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

    目录 概念 库函数 实现 代码 概念 修复是图像插值.数字修复算法在图像插值,照片恢复,缩放和超分辨率等方面具有广泛的应用. 大多数人会在家里放一些旧的退化照片,上面有一些黑点,一些笔画等.你有没有想过恢复它?我们不能简单地在绘画工具中擦除它们,因为它将简单地用白色结构替换黑色结构,这是没有用的.在这些情况下,使用称为图像修复的技术.基本思路很简单:用邻近的像素替换那些坏标记,使其看起来像是邻居(取自维基百科),考虑下面显示的图像: 库函数 dst = cv2.inpaint(src,mask,

  • Opencv中的cv2.calcHist()函数的作用及返回值说明

    目录 cv2.calcHist()函数 cv2.calcHist()函数的作用 cv2.calcHist()函数的返回值 在讨论其返回值前,我们先来介绍以下calcHist()函数的用法: cv2.calcHist()函数 cv2.calcHist()函数的作用 通过直方图可以很好的对整幅图像的灰度分布有一个整体的了解,直方图的x轴是灰度值(0~255),y轴是图片中具有同一个灰度值的点的数目. 而calcHist()函数则可以帮助我们统计一幅图像的直方图 cv2.calcHist(images

  • 浅谈Python Opencv中gamma变换的使用详解

    伽马变换就是用来图像增强,其提升了暗部细节,简单来说就是通过非线性变换,让图像从暴光强度的线性响应变得更接近人眼感受的响应,即将漂白(相机曝光)或过暗(曝光不足)的图片,进行矫正. 伽马变换的基本形式如下: 大于1时,对图像的灰度分布直方图具有拉伸作用(使灰度向高灰度值延展),而小于1时,对图像的灰度分布直方图具有收缩作用(是使灰度向低灰度值方向靠拢). #分道计算每个通道的直方图 img0 = cv2.imread('12.jpg') hist_b = cv2.calcHist([img0],

  • python opencv检测直线 cv2.HoughLinesP的实现

    cv2.HoughLines()函数是在二值图像中查找直线,cv2.HoughLinesP()函数可以查找直线段. cv2.HoughLinesP()函数原型: HoughLinesP(image, rho, theta, threshold, lines=None, minLineLength=None, maxLineGap=None) image: 必须是二值图像,推荐使用canny边缘检测的结果图像: rho: 线段以像素为单位的距离精度,double类型的,推荐用1.0 theta:

  • OpenCV图像修复cv2.inpaint()的使用

    目录 1. 效果图 2. 原理 3. 源码 这篇博客将介绍如何通过OpenCV中图像修复的技术--cv2.inpaint() 去除旧照片中的小噪音.笔划等.并提供一个可交互式的程序,利用OpenCV的快速行进和流体力学俩种修复算法对自己的图片进行修复. 大多数人家里都会有一些旧的老化照片,上面有一些黑点.笔划等.如何复原呢? 在绘制工具中擦除:将简单地用无用的白色结构替换黑色结构,效果并不理想.OpenCV中图像修复的技术--基本思想很简单:用相邻像素替换这些坏标记,使其看起来像邻居. cv2.

  • Python Opencv中获取卷积核的实现代码

    目录 1.cv2.getStructuringElement(shape,ksize,anchor=(-1,-1)) 2.函数讲解 3.代码实战 1.cv2.getStructuringElement(shape,ksize,anchor=(-1,-1)) 该函数构造并返回可进一步传递给createMorphologyFilter().Correase().Explate()或morphologyEx()的结构元素.但您也可以自己构造任意的二进制掩码,并将其用作结构元素. 2.函数讲解 getS

  • Python Opencv中基础的知识点

    目录 1.创建窗口 2.保存图片 3.采集视频 4.鼠标控制 5.TrackBar组件 OpenCV 是一个流行的开源计算机视觉库,可用于不同的编程语言,例如 Python.C++ 和 JavaScript.它提供了一套丰富的工具来处理和分析图像和视频,让你可以从调整单张图片的大小到构建复杂的对象识别应用程序. 本文给大家介绍Python Opencv中基础的知识点. 1.创建窗口 import cv2 import numpy as np def createWindow(): #读取图片 i

  • Python OpenCV中的drawMatches()关键匹配绘制方法

    目录 作用说明 函数原型 参数详解 结果 作用说明 该方法被用于绘制关键点的匹配情况.我们看到的许多匹配结果都是使用这一方法绘制的——一左一右两张图像,匹配的关键点之间用线条链接. 函数原型 cv.drawMatches( img1, keypoints1, img2, keypoints2, matches1to2, outImg[, matchColor[, singlePointColor[, matchesMask[, flags]]]]) -> outImg cv.drawMatche

  • Python OpenCV中的numpy与图像类型转换操作

    Python OpenCV存储图像使用的是Numpy存储,所以可以将Numpy当做图像类型操作,操作之前还需进行类型转换,转换到int8类型 import cv2 import numpy as np # 使用numpy方式创建一个二维数组 img = np.ones((100,100)) # 转换成int8类型 img = np.int8(img) # 颜色空间转换,单通道转换成多通道, 可选可不选 img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) cv2

随机推荐