Python,OpenCV中的图像修复——cv2.inpaint()
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()相关推荐
- 【图像处理】——Python+opencv实现提取图像的几何特征(面积、周长、细长度、区间占空比、重心、不变矩等)
转载请注明详细地址 本文简单介绍了图像常见几何特征的概念以及求解方法 本文介绍了Python和opencv求解几何特征的常用方法 目录 其他形状外接轮廓的方法可以参考:<OpenCV-Pytho ...
- 用python怎么样实现图像二值化_使用Python+OpenCV如何实现图像二值化
使用Python+OpenCV如何实现图像二值化 发布时间:2020-10-26 14:15:52 来源:亿速云 阅读:77 作者:蛋片鸡 这篇文章运用简单易懂的例子给大家介绍使用Python+Ope ...
- opencv 锐化 java_如何在OpenCV中锐化图像?
如何在OpenCV中锐化图像? 如何使用OpenCV锐化图像? 有许多平滑或模糊的方法,但没有我能看到的锐化. 7个解决方案 147 votes 关于反锐化掩蔽的维基百科文章中列出了一个通用程序:您使 ...
- 灰度拉伸python,Python OpenCV实例:图像灰度拉伸
Python OpenCV实例:图像灰度拉伸 Python OpenCV实例:图像灰度拉伸 为什么80%的码农都做不了架构师?>>> #coding:utf-8 ''' 灰度拉伸 定 ...
- 番外3. Python OpenCV 中如何绘制各种图形?
本系列专栏写作方式 本系列专栏写作将采用首创的问答式写作形式,快速让你学习到 OpenCV 的初级.中级.高级知识. 3. Python OpenCV 中如何绘制各种图形? 本篇博客主要分享一下在 P ...
- 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 ...
- Python+OpenCV:交互式图像前景提取(Interactive Foreground Extraction using GrabCut Algorithm)
Python+OpenCV:交互式图像前景提取(Interactive Foreground Extraction using GrabCut Algorithm) ################# ...
- cv2.cornerHarris()详解 python+OpenCV 中的 Harris 角点检测
原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/8763369.html 参考文献----------OpenCV-Python-Toturial ...
- OpenCV图像修复函数inpaint()
前言 在实际应用或者是工程当中,经常需要对图像进行修复,在OpenCV中提供了能够对含有较少"污染"或者水印的图像进行修复的inpaint()函数 函数原型 void cv::in ...
最新文章
- 配置Windows Server 2003 的RADIUS Server的方法
- Google AI 研发医疗新模型,预测死亡率比医院高出10%
- Linux系统内存的Cached Memory
- Windows 2012 R2 中 AD DS 部署
- Python编程核心内容 ---- Function(函数)
- mysql命令:为mysql命令指定字符集
- Oracle误删除后的找回方法
- MembershipUserProvider For ScrewTurn 3.0
- 修改linux系统的open files参数
- chromedriver下载链接以及对应版本
- Layui动态修改列名
- 获取当前本地登录的QQ号码
- word 宏相关代码集合
- 应聘引擎程序需做哪些准备
- 诛仙手游android转苹果,诛仙手游安卓和iOS互通吗 安卓和iOS能不能一起玩
- linux 进程带宽限制,Linux限制网络带宽的占用
- 1041. 考试座位号
- SFDC中的DEBUG
- 关于C之文件结尾EOF与二进制文件换行符
- Python毕业设计必备案例:【学生信息管理系统】
热门文章
- 2021年大数据ELK(四):Lucene的美文搜索案例
- VMware14安装CentOS7的详细教程
- Caused by: org.gradle.api.InvalidUserDataException: NDK not configured
- Android ViewAnimationUtils (动画) 的使用
- 微信小程序去掉左上角的返回箭头
- java面向过程和面向对象
- SQL*Plus 系统变量之15 - DESC[RIBE]
- 一篇文章让你读懂Pivotal的GemFire家族产品
- Python Web学习笔记之Python多线程基础
- SpringBoot02_构建rest工程完成第一个controller类