图像修复 python_50.图像修复

图像修复 python_50.图像修复目标本节主要学习内容 使用图像修复技术去除照片中的噪声和划痕 掌握 OpenCV 中与图像修复技术相关的函数基础说明想一想 你在生活中有没有遇到过这样的问题 一张自己很喜欢的具有怀念意义的照片 随着年代的久远 照片逐渐老化 有时候在看照片时一不小心弄上了点污渍或者是画了几笔 你有没有想过要修复这些照片呢 你可能会说 我可以使用笔刷工具简易在上面涂抹两下不就行了吗 但这其实是没用的 事实上你只

目标

本节主要学习内容:

• 使用图像修复技术去除照片中的噪声和划痕

• 掌握 OpenCV 中与图像修复技术相关的函数

基础说明

想一想,你在生活中有没有遇到过这样的问题?一张自己很喜欢的具有怀念意义的照片,随着年代的久远,照片逐渐老化,有时候在看照片时一不小心弄上了点污渍或者是画了几笔。你有没有想过要修复这些照片呢?你可能会说,我可以使用笔刷工具简易在上面涂抹两下不就行了吗?但这其实是没用的,事实上你只是用白色笔画取代了黑色笔画。

图像修复 python_50.图像修复

此时要想恢复照片的原貌,就需要用到图像修复(也叫图像恢复)技术了。这种技术的基本想法其实很简单:使用坏点周围的像素取代坏点。这样它看起来和周围像素就比较像了。

算法介绍

为了实现上面所说的目的,科学家们和众多研究者在图像修复领域其实已经提出了好多种算法?我们重点讲OpenCV 中的实现算法,OpenCV提供了其中的两种。这两种算法都可以通过使用函数 cv2.inpaint() 来实现。

算法一:根据 Alexandru_Telea 在 2004 发表的文章实现。基于快速进行算法。以图像中一个待修补的区域为例。算法从这个区域的边界开始向区域内部慢慢前进,首先填充区域边界像素。然后选取待修复像素周围的一个小的邻域,使用这个区域内的归一化加权和更新待修复的像素值。权重的选择非常重要。对于靠近带修复点的像素点,靠近正常边界像素点和在轮廓上的像素点给予更高的权重。当一个像素被修复之后,使用快速进行算法(FMM)移动到下一个最近的像素。FMM 保证了靠近已知(没有退化)像素点的坏点先被修复,这与手工启发式操作比较类似。在OpenCV可以通过置标签参数为 cv2.INPAINT_TELEA 来使用此算法。

算法二:根据 Bertalmio,Marcelo,Andrea_L.Bertozzi, 和 Guillermo_Sapiro在 2001 年发表的文章实现的。基于流体动力学并使用了偏微分方程。基本原理是启发式的。它首先沿着正常区域的边界向退化区域前进。(因为边界是连续的,所以退化区域的边界与正常区域的边界应也是连续的)。它通过匹配代修复区域的梯度向量来延伸等光强线(isophotes,由灰度值相等的点连成的线)。为了实现这个目的,作者使用了流体动力学中的一些方法。完成这一步之后,通过填充颜色来使这个区域内的灰度值变化最小。可以通过设置标签参数为 cv2.INPAINT_NS 来使用此算法。

代码实现

图像修复 python_50.图像修复

messi_2.png

图像修复 python_50.图像修复

mask2.png

原理:我们首先创建一个与输入入图像大小相等的掩模图像。将待修复区域的像素设置为 255,其他地方为 0。待修复的图像中有几个黑色笔画。我是使用画笔工具添加的。

# -*- coding: utf-8 -*

import numpy as np

import cv2

img = cv2.imread(‘messi_2.png’)

# 缩放的目的是为了保证掩模图像和原图像大小一致

img = cv2.resize(img, (150, 112))

print(img.shape, img.size)

mask = cv2.imread(‘mask2.png’, 0)

print(mask.shape, mask.size)

# 使用算法一修复

dst = cv2.inpaint(img, mask, 3, cv2.INPAINT_TELEA)

# 使用算法二修复

dst2 = cv2.inpaint(img, mask, 3, cv2.INPAINT_NS)

# 显示待修复图像

cv2.imshow(‘img’,img)

# 算法一的修复结果

cv2.imshow(‘dst’, dst)

# 算法二的修复结果

cv2.imshow(‘dst2’,dst2)

cv2.waitKey(0)

cv2.destroyAllWindows()

运行结果如下:第一幅图是退化后的输入图像?第二幅是掩模图像。第三幅是使用第一个算法的结果,最后一副是使用第二个算法的结果。

图像修复 python_50.图像修复

更多资源和技巧:

1. Bertalmio, Marcelo, Andrea L. Bertozzi, and Guillermo Sapiro.?Navier-stokes, fluid dynamics, and image and video       inpainting.?In Computer Vision and Pattern Recognition, 2001. CVPR2001. Proceedings of the 2001 IEEE Computer     Society Confer-ence on, vol. 1, pp. I-355. IEEE, 2001.

2. Telea, Alexandru. ?An image inpainting technique based on the fast marching method.?Journal of graphics tools         9.1 (2004): 23-34.

3.OpenCV附带了一个关于修补的交互式示例,samples/python2/inpaint.py,试试看。(注意python版本和OpenCV版本)

4. 查看python中某个库的安装位置:import cv2   cv2.__file__

5.关于内容感知填充(Content Aware Fill:https://www.youtube.com/watch?v=ZtoUiplKa2A)的视频,这是Adobe Photoshop中使用的一种高级修复技术。(您需要安装单独的插件)。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/209598.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午8:52
下一篇 2026年3月19日 上午8:52


相关推荐

  • malloc函数具体解释

    malloc函数具体解释

    2021年12月7日
    60
  • C语言实现关机程序

    C语言实现关机程序这次写一个关机程序,要知道关机程序是shutdown这是关机指令。但这是系统指令,所以要调用执行系统命令的函数,system,但是也要引system的头文件:stdlib.h边写代码边解释#include<stdio.h>#include<stdlib.h>//调用system函数所需的头文件#include<string.h>//调用strcmp所需的头文件intmain(){charinput[20]={0};//这里是创建一个存储字符的数

    2022年7月22日
    14
  • java中map转string_字符串转list集合

    java中map转string_字符串转list集合JAVAMap集合转String,String转Map集合当前两个转换方法主要用作支付宝,微信支付额外参数转换先看效果是不是诸君想要的map转string的值id=1&amp;amp;amp;amp;name=哆啦A梦丶幻想string转map的值{name=哆啦A梦丶幻想,id=1}贴代码://这里是用单元测试测试的两个方法@Testpubli…

    2025年10月20日
    5
  • Java String.replace()方法

    Java String.replace()方法用法实例教程,返回一个新的字符串,用newChar替换此字符串中出现的所有oldChar声明以下是java.lang.String.replace()方法的声明public String replace(char oldChar, char newChar)参数oldChar — 这是旧的字符.newChar — 这是新

    2022年3月10日
    153
  • JS中判断一个对象是否为null、undefined、0

    JS中判断一个对象是否为null、undefined、0

    2021年10月31日
    145
  • js JavaScript vue 时间戳 转换 日期 YYYY-MM-DD hh:mm:ss 简洁写法

    js JavaScript vue 时间戳 转换 日期 YYYY-MM-DD hh:mm:ss 简洁写法两种方法方法一使用两个apitoLocaleDateString()和toTimeString()加正则表达式,简洁写法,推荐!还可以更改为以点(.)连接——正则表达式代码letnewDate=newDate();this.date=newDate.toLocaleDateString().replace(/\//g,”-“)+””+newDate.toTimeString().substr(0,8);结果缺点月份不能是03的形式

    2022年8月30日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号