- 1. 学习如何在你的电脑上配置OpenCV-Python环境!
- 1.1 开始了解OpenCV-Python
- 1.2 在 Windows 下安装 OpenCV-Python
- 1.3 在 Fedora 环境下安装 OpenCV-Python
- 1.4 在 Debian(Ubuntu)中配置 OpenCV-Python
- 1.5 在Docker中安装OpenCV-Python
- 1.6 在树莓派配置OpenCV-Python
- 2. OpenCV中的GUI功能
- 2.1 开始使用图像
- 2.2 开始使用视频
- 2.3 OpenCV 中的绘图函数
- 2.4 以鼠标为画笔
- 2.5 用滑块控制条做调色板
- 3. OpenCV中的GUI功能
- 3.1 图片基本操作
- 3.2 图像算术操作
- 3.3 性能评估与改进技巧
- 4. OpenCV中的图像处理
- 4.1 更换颜色空间
- 4.2 对图像进行几何变换
- 4.3 图像二值化处理
- 4.4 平滑图像
- 4.5 形态学转换
- 4.6 图像梯度
- 4.7 Canny边缘检测
- 4.8 图像金字塔
- 4.9.1 直方图:查找,绘制,分析
- 4.9.2 直方图均衡化
- 4.9.3 二维直方图
- 4.9.4 直方图反投影
- 4.10 OpenCV中的图像变换
- 4.10.1 傅立叶变换
- 4.11 模板匹配
- 4.12 霍夫直线变换
- 4.13 霍夫圆变换
- 4.14 基于分水岭算法的图像分割
- 4.14 使用 GrabCut 算法交互式前景提取
- 5. 特征检测和描述符
- 5.1 理解特征
- 5.2 Harris 角点检测
- 5.3 Shi-Tomasi 角点检测 & 适合用来跟踪的特征
- 5.4 介绍SIFT(尺度不变特征转换)
- 5.5 介绍SURF(加速稳健特征)
- 5.6 角点检测的FAST算法
- 5.7 BRIEF特征点描述算法
- 5.8 ORB 特征描述符(Oriented FAST and Rotated BRIEF)
- 5.9 特征匹配
- 5.10 特征匹配和使用单应性匹配来搜索物体
- 6. 视频分析
- 6.1 Meanshift和Camshift
- 6.2 光流
- 6.3 背景分割
- 7. 相机校准和3D重建
- 7.1 相机校准
- 7.2 姿势估计
- 7.3 极线几何
- 7.4 来自立体图像的深度图
- 8. 机器学习
- 8.1 K-最近邻算法
- 8.1.1 了解k-最近邻算法
- 8.1.2 使用kNN进行手写字符的OCR
- 8.2 支持向量机(SVM)
- 8.2.1 理解SVM
- 8.2.2 使用SVM的手写数据的OCR
- 8.3 K-Means聚类
- 8.3.1 理解 K-Means 聚类
- 8.3.2 OpenCV中的K-Means聚类
- 9. 计算摄影学
- 9.1 图像去噪
- 9.2 图像修复
- 9.3 高动态范围(HDR)
- 10. 目标检测
- 10.1 使用 Haar Cascades 的面部识别
- 11. OpenCV-Python 绑定
- 11.1 OpenCV-Python绑定如何工作?
9.2 图像修复
目标
在这一章当中,
- 我们将学习如何通过一种叫做 图像修复(inpainting)的方法来去除旧照片中的小噪音,划痕等等
- 我们将看到 OpenCV 中的功能。
基础知识
你们大多数人会在家里看到一些老旧的照片,上面有一些黑点,一些划痕等等。你有没有想过去修复它?我们不能简单地在绘画工具中抹去它们,因为它只是用白色的结构来代替黑色的结构,这是没有用的。在这些情况下,使用了一种称为图像修复的技术。基本的想法很简单:用相邻的像素替换那些不好的标记,使其看起来像其邻居。考虑下面显示的图片(取自维基百科)。
为此目的设计了几种算法,OpenCV 提供了两种算法。两者都可以通过相同的函数 cv2.inpaint()
来访问
第一种算法是基于Alexandru Telea在2004年发表的论文《An Image Inpainting Technique Based on the Fast Marching Method》。它基于快速前进法。考虑图像中的将被修复的一个区域。算法从这个区域的边界开始,并在该区域内逐渐填充边界中的所有内容。在邻居的像素周围需要一个小的邻域进行修补。这个像素被邻域中所有已知像素的归一化加权和所取代。选择权重是一个重要的事情。对位于该点附近的那些像素,靠近边界的法线以及位于边界轮廓上的那些像素将会赋予更大的权重。一旦一个像素被修补,它将使用快速前进法移动到下一个最近的像素。 快速前进法确保已知像素附近的像素首先被修补,以便它像一个手动启发式操作一样工作。该算法通过使用标志cv2.INPAINT_TELEA
来启用。
第二种算法是基于Bertalmio,Marcelo,Andrea L. Bertozzi和Guillermo Sapiro在2001年发表的《Navier-Stokes, Fluid Dynamics, and Image and Video Inpainting》论文。该算法基于流体动力学并利用偏微分方程。基本原理是启发式。它首先沿着已知区域的边缘行进到未知区域(因为边缘是连续的)。它继续等照度(连接相同强度点的线,就像轮廓连接具有相同高度的点),同时匹配修补区边界处的梯度向量。为此,使用流体动力学的一些方法。一旦获得,就会填充颜色以减少该区域的最小偏差。该算法通过使用标志cv2.INPAINT_NS
来启用。
代码
我们需要创建一个与输入图像大小相同的mask,其中非零像素对应于要被修补的区域。其他一切都很简单。我的图像中有一些黑色笔画(是我手动添加的)。我用Paint工具创建了相应的笔画。
import numpy as np
import cv2
img = cv2.imread('messi_2.jpg')
mask = cv2.imread('mask2.png',0)
dst = cv2.inpaint(img,mask,3,cv2.INPAINT_TELEA)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
看下面的结果。第一张图片显示 degrade 后的输入。第二个图像是 mask。第三个图像是第一个算法的结果,最后一个图像是第二个算法的结果。
更多资源
- Bertalmio,Marcelo,Andrea L. Bertozzi和Guillermo Sapiro。《Navier-stokes, fluid dynamics, and image and video inpainting》。在Computer Vision and Pattern Recognition, 2001. CVPR 2001. Proceedings of the 2001 IEEE Computer Society Conference on, vol. 1, pp. I-355. IEEE, 2001.
- Telea, Alexandru. 《An image inpainting technique based on the fast marching method》 Journal of graphics tools 9.1 (2004): 23-34.
练习
- OpenCV 带有一个关于图像修复的交互式例子代码,samples/python/inpaint.py,试试吧。
- 几个月前,我观看了 Adobe Photoshop 中使用的高级修补技术 Content-Aware Fill 的视频。在进一步的搜索,我能够发现,同样的技术已经在 GIMP 有不同的名称,Resynthesizer(你需要安装单独的插件)。我相信你会喜欢这项技术。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论