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

  • 1. 效果图
  • 2. 原理
  • 3. 源码
  • 参考

image inpainting 图像修改

这篇博客将介绍如何通过OpenCV中图像修复的技术——cv2.inpaint() 去除旧照片中的小噪音、笔划等。并提供一个可交互式的程序,利用OpenCV的快速行进和流体力学俩种修复算法对自己的图片进行修复。

大多数人家里都会有一些旧的老化照片,上面有一些黑点、笔划等。如何复原呢?

在绘制工具中擦除:将简单地用无用的白色结构替换黑色结构,效果并不理想。OpenCV中图像修复的技术——基本思想很简单:用相邻像素替换这些坏标记,使其看起来像邻居。

  • cv2.INPAINT_TELEA(Fast Marching Method 快速行进算法)

  • cv2.INPAINT_NS(Fluid Dynamics Method 流体力学算法)

  • OpenCV未实现的:Content-Aware Fill 内容感知填充算法,这是Adobe Photoshop中使用的一种高级修复技术。

cv2.inpaint() 优点:修复效果更加自然;
缺点:修复时需要提供原图以及mask图(与原图一致只有被污染的像素区域有值);

1. 效果图

官方原始图 VS mask图 VS 快速行进算法修复效果 VS 流体力学修复效果 如下:

接下来用可交互的例子实现自己的图片修复;

原始图 VS Mask图 VS 快速行进算法修复效果图如下:
原始图随意用鼠标左键移动绘制点、线,右键移动绘制矩形来随机增加一些被污染的区域;
并根据原始图生成mask图,mask图是与原始图具有相同大小,并且只有被污染的区域是白色像素的图。可以看到修复效果还是挺好的~
原始图 VS Mask图 VS 流体力学算法修复效果图如下:
原始图随意用鼠标左键移动绘制点、线,右键移动绘制矩形来随机增加一些被污染的区域;
mask图是与原始图具有相同大小,并且只有被污染的区域是白色像素的图。可以看到修复效果还是挺好的~

快速行进算法与流体力学算法修复的效果图差别不太大;

2. 原理

  • cv2.INPAINT_TELEA (Fast Marching Method 快速行进算法),对位于点附近、边界法线附近和边界轮廓上的像素赋予更多权重。一旦一个像素被修复,它将使用快速行进的方法移动到下一个最近的像素。

  • cv2.INPAINT_NS(Fluid Dynamics Method 流体力学算法),使用了流体力学的一些方法,基本原则是启发式的。首先沿着边从已知区域移动到未知区域(因为边是连续的)。它在匹配修复区域边界处的渐变向量的同时,继续等高线(连接具有相同强度的点的线,就像等高线连接具有相同高程的点一样)。

  • OpenCV未实现的:Content-Aware Fill 内容感知填充算法,这是Adobe Photoshop中使用的一种高级修复技术。

3. 源码

# 图像修复交互式案例——通过水流填充算法来修复被破坏的图像区域;
# 使用俩种方法进行修复
# 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()

参考

  • https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_photo/py_inpainting/py_inpainting.html#inpainting

Python,OpenCV中的图像修复——cv2.inpaint()相关推荐

  1. 【图像处理】——Python+opencv实现提取图像的几何特征(面积、周长、细长度、区间占空比、重心、不变矩等)

    转载请注明详细地址 本文简单介绍了图像常见几何特征的概念以及求解方法 本文介绍了Python和opencv求解几何特征的常用方法 目录 其他形状外接轮廓的方法可以参考:<OpenCV-Pytho ...

  2. 用python怎么样实现图像二值化_使用Python+OpenCV如何实现图像二值化

    使用Python+OpenCV如何实现图像二值化 发布时间:2020-10-26 14:15:52 来源:亿速云 阅读:77 作者:蛋片鸡 这篇文章运用简单易懂的例子给大家介绍使用Python+Ope ...

  3. opencv 锐化 java_如何在OpenCV中锐化图像?

    如何在OpenCV中锐化图像? 如何使用OpenCV锐化图像? 有许多平滑或模糊的方法,但没有我能看到的锐化. 7个解决方案 147 votes 关于反锐化掩蔽的维基百科文章中列出了一个通用程序:您使 ...

  4. 灰度拉伸python,Python OpenCV实例:图像灰度拉伸

    Python OpenCV实例:图像灰度拉伸 Python OpenCV实例:图像灰度拉伸 为什么80%的码农都做不了架构师?>>> #coding:utf-8 ''' 灰度拉伸 定 ...

  5. 番外3. Python OpenCV 中如何绘制各种图形?

    本系列专栏写作方式 本系列专栏写作将采用首创的问答式写作形式,快速让你学习到 OpenCV 的初级.中级.高级知识. 3. Python OpenCV 中如何绘制各种图形? 本篇博客主要分享一下在 P ...

  6. Python+OpenCV:立体图像深度图(Depth Map from Stereo Images)

    Python+OpenCV:立体图像深度图(Depth Map from Stereo Images) 理论 If we have two images of same scene, we can g ...

  7. Python+OpenCV:交互式图像前景提取(Interactive Foreground Extraction using GrabCut Algorithm)

    Python+OpenCV:交互式图像前景提取(Interactive Foreground Extraction using GrabCut Algorithm) ################# ...

  8. cv2.cornerHarris()详解 python+OpenCV 中的 Harris 角点检测

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/8763369.html 参考文献----------OpenCV-Python-Toturial ...

  9. OpenCV图像修复函数inpaint()

    前言 在实际应用或者是工程当中,经常需要对图像进行修复,在OpenCV中提供了能够对含有较少"污染"或者水印的图像进行修复的inpaint()函数 函数原型 void cv::in ...

最新文章

  1. 配置Windows Server 2003 的RADIUS Server的方法
  2. Google AI 研发医疗新模型,预测死亡率比医院高出10%
  3. Linux系统内存的Cached Memory
  4. Windows 2012 R2 中 AD DS 部署
  5. Python编程核心内容 ---- Function(函数)
  6. mysql命令:为mysql命令指定字符集
  7. Oracle误删除后的找回方法
  8. MembershipUserProvider For ScrewTurn 3.0
  9. 修改linux系统的open files参数
  10. chromedriver下载链接以及对应版本
  11. Layui动态修改列名
  12. 获取当前本地登录的QQ号码
  13. word 宏相关代码集合
  14. 应聘引擎程序需做哪些准备
  15. 诛仙手游android转苹果,诛仙手游安卓和iOS互通吗 安卓和iOS能不能一起玩
  16. linux 进程带宽限制,Linux限制网络带宽的占用
  17. 1041. 考试座位号
  18. SFDC中的DEBUG
  19. 关于C之文件结尾EOF与二进制文件换行符
  20. Python毕业设计必备案例:【学生信息管理系统】

热门文章

  1. 2021年大数据ELK(四):Lucene的美文搜索案例
  2. VMware14安装CentOS7的详细教程
  3. Caused by: org.gradle.api.InvalidUserDataException: NDK not configured
  4. Android ViewAnimationUtils (动画) 的使用
  5. 微信小程序去掉左上角的返回箭头
  6. java面向过程和面向对象
  7. SQL*Plus 系统变量之15 - DESC[RIBE]
  8. 一篇文章让你读懂Pivotal的GemFire家族产品
  9. Python Web学习笔记之Python多线程基础
  10. SpringBoot02_构建rest工程完成第一个controller类