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

news/2024/12/5 9:39:38/

库函数使用:

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

参数是:

  1. src:输入8位1通道或3通道图像。
  2. inpaintMask:修复掩码,8位1通道图像。非零像素表示需要修复的区域。
  3. inpaintRadius:算法考虑的每个点的圆形邻域的半径。
  4. flags
    1. INPAINT_NS基于Navier-Stokes的方法(Fast Marching Method 快速行进算法)
    2. Alexandru Telea的INPAINT_TELEA方法(Fluid Dynamics Method 流体力学算法)

返回:dst:输出与src具有相同大小和类型的图像。
备注:快速行进算法与流体力学算法修复的效果图差别不太大

使用,例如:

fmmres = cv2.inpaint(img_mark, mark, 3, cv2.INPAINT_TELEA)
nsres = cv2.inpaint(img_mark, mark, 3, cv2.INPAINT_NS)

原理: 

OpenCV中图像修复的技术——基本思想很简单:用相邻像素替换这些坏标记,使其看起来像邻居。这两种算法用起来:
缺点:修复时需要提供原图以及mask图(与原图一致只有被污染的像素区域有值);

他们的原理:

  • cv2.INPAINT_TELEA (Fast Marching Method 快速行进算法),对位于点附近、边界法线附近和边界轮廓上的像素赋予更多权重。一旦一个像素被修复,它将使用快速行进的方法移动到下一个最近的像素。
  • cv2.INPAINT_NS(Fluid Dynamics Method 流体力学算法),使用了流体力学的一些方法,基本原则是启发式的。首先沿着边从已知区域移动到未知区域(因为边是连续的)。它在匹配修复区域边界处的渐变向量的同时,继续等高线(连接具有相同强度的点的线,就像等高线连接具有相同高程的点一样)。

代码实现上:

# 图像修复交互式案例——通过水流填充算法来修复被破坏的图像区域;
# 使用俩种方法进行修复
# cv2.INPAINT_TELEA (Fast Marching Method 快速行进算法),对位于点附近、边界法线附近和边界轮廓上的像素赋予更多权重。一旦一个像素被修复,它将使用快速行进的方法移动到下一个最近的像素。
# cv2.INPAINT_NS 流体力学算法,使用了流体力学的一些方法,基本原则是启发式的,首先沿着边从已知区域移动到未知区域(因为边是连续的)。它在匹配修复区域边界处的渐变向量的同时,继续等高线(连接具有相同强度的点的线,就像等高线连接具有相同高程的点一样)。# USAGE 
# python inpaint.py D:/deepLearning/py-demo/20210808/images/ml.jpg# 按下鼠标左键,添加点、线,按下鼠标右键,添加矩形框,以制作被污染的需要修复图像
# 按下空格键:执行修复功能
# 按下r键:重置待修复的mask
# 按下esc键,退出
import cv2
import numpy as npclass Sketcher:def __init__(self, windowname, dests, colors_func):self.prev_pt = None  # 线起始点self.drag_start = None  # 矩形起点self.drag_rect = None  # 矩形(左上角,右下角)坐标self.windowname = windownameself.dests = destsself.colors_func = colors_funcself.dirty = Falseself.drawing = Falseself.mode = Falseself.show()cv2.setMouseCallback(self.windowname, self.on_mouse)def show(self):cv2.imshow(self.windowname, self.dests[0])def on_mouse(self, event, x, y, flags, param):pt = (x, y)if event == cv2.EVENT_LBUTTONDOWN:self.prev_pt = ptself.drawing = Trueelif event == cv2.EVENT_RBUTTONDOWN:# 第一次初始化时设定pt,往后保留上一个点作为矩形起点if self.drag_start == None:self.drag_start = ptif self.prev_pt and flags & cv2.EVENT_FLAG_LBUTTON:for dst, color in zip(self.dests, self.colors_func()):cv2.line(dst, self.prev_pt, pt, color, 5)self.dirty = Trueself.prev_pt = ptself.show()if self.drag_start and flags & cv2.EVENT_FLAG_RBUTTON:xo, yo = self.drag_startx0, y0 = np.minimum([xo, yo], [x, y])x1, y1 = np.maximum([xo, yo], [x, y])self.drag_rect = Noneif x1 - x0 > 0 and y1 - y0 > 0:self.drag_rect = (x0, y0, x1, y1)for dst, color in zip(self.dests, self.colors_func()):cv2.rectangle(dst, (x0, y0), (x1, y1), color, -1)self.dirty = Trueself.drag_start = Noneself.drag_rect = Noneself.show()else:self.drag_start = pt@propertydef dragging(self):return self.drag_rect is not Nonedef main():import systry:fn = sys.argv[1]except:fn = 'images/ml_.jpg'img = cv2.imread(fn)if img is None:print('Failed to load image file:', fn)sys.exit(1)img_mark = img.copy()mark = np.zeros(img.shape[:2], np.uint8)sketch = Sketcher('img', [img_mark, mark], lambda: ((255, 255, 255), 255))while True:ch = cv2.waitKey()if ch == 27:breakif ch == ord(' '):cv2.imshow('mask', mark)fmmres = cv2.inpaint(img_mark, mark, 3, cv2.INPAINT_TELEA)nsres = cv2.inpaint(img_mark, mark, 3, cv2.INPAINT_NS)cv2.imshow('inpaint fmm res', fmmres)cv2.imshow('inpaint ns res', nsres)if ch == ord('r'):img_mark[:] = imgmark[:] = 0sketch.show()print('Done')if __name__ == '__main__':main()cv2.destroyAllWindows()

 

Python,OpenCV中的图像修复——cv2.inpaint()_程序媛一枚~的博客-CSDN博客_图像修复python

Python-OpenCV中的cv2.inpaint()函数 - Rogn - 博客园


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

相关文章

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 是一款强大的实用图片去水印软件,可从图片上去除不必要的物体,让您轻松摆脱图片上的水印、划痕、污渍、标志等瑕疵。 支持语言:简体中文 运行平台:Win7及以上,Mac10.13及以上 设备数量:授权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独家发布,Teorex Inpaint 是一款图片图形移除软件,如果你有照片不满意这时不需要大费周章的使用PS来做,只需要启动…

Teorex Inpaint 6.0 简体中文最新破解版(自动去除图片上的水印)

Inpaint(去水印软件)是一款去除图片背景中瑕疵的图片处理软件。如果你的图片中有一些你不满意的瑕疵,你不必动用庞大PS来兴师动众处理,只需要使用Teorex.Inpaint就可以轻松搞定。运用选择工具选取你希望去除的对象,然后选择伪装,I…

Inpaint破解版 - 图片去水印神器

Inpaint是一款强大实用的图片去水印软件,您的图片中不想要的部分,如额外的线,人物,文字等……选定后补绘都会帮你全自动进行擦除,同时补绘会根据附近图片区域重建擦除的区域,使看起来完美无暇,没…

管理类联考——写作——技巧篇——论证有效性——谬误概念汇总简释

批判性思维常见逻辑谬误 有些错误出现在我们澄清或定义某个观点的时候,有些错误出现在我们收集证据或者用证据和理由支撑某个观点的时候,有些错误出现在我们尝试从证据得出结论的时候,有些错误甚至出现在我们评估他人的观点或者理由的时候。…