iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > Python >OpenCV图像修复cv2.inpaint()的使用
  • 819
分享到

OpenCV图像修复cv2.inpaint()的使用

2024-04-02 19:04:59 819人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录1. 效果图2. 原理3. 源码这篇博客将介绍如何通过OpenCV中图像修复的技术——cv2.inpaint() 去除旧照片中的小噪音、笔划等。并提供一个可交互式的程序,利用Op

这篇博客将介绍如何通过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 np


class Sketcher:
    def __init__(self, windowname, dests, colors_func):
        self.prev_pt = None  # 线起始点
        self.drag_start = None  # 矩形起点
        self.drag_rect = None  # 矩形(左上角,右下角)坐标
        self.windowname = windowname
        self.dests = dests
        self.colors_func = colors_func
        self.dirty = False
        self.drawing = False
        self.mode = False
        self.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 = pt
            self.drawing = True
        elif event == cv2.EVENT_RBUTTONDOWN:
            # 第一次初始化时设定pt,往后保留上一个点作为矩形起点
            if self.drag_start == None:
                self.drag_start = pt

        if 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 = True
            self.prev_pt = pt
            self.show()

        if self.drag_start and flags & cv2.EVENT_FLAG_RBUTTON:
            xo, yo = self.drag_start
            x0, y0 = np.minimum([xo, yo], [x, y])
            x1, y1 = np.maximum([xo, yo], [x, y])
            self.drag_rect = None
            if 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 = True
                self.drag_start = None
                self.drag_rect = None
                self.show()
            else:
                self.drag_start = pt

    @property
    def dragging(self):
        return self.drag_rect is not None


def main():
    import sys
    try:
        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:
            break
        if 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[:] = img
            mark[:] = 0
            sketch.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

到此这篇关于OpenCV图像修复cv2.inpaint()的使用的文章就介绍到这了,更多相关OpenCV图像修复cv2.inpaint()内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: OpenCV图像修复cv2.inpaint()的使用

本文链接: https://www.lsjlt.com/news/132247.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • OpenCV图像修复cv2.inpaint()的使用
    目录1. 效果图2. 原理3. 源码这篇博客将介绍如何通过OpenCV中图像修复的技术——cv2.inpaint() 去除旧照片中的小噪音、笔划等。并提供一个可交互式的程序,利用Op...
    99+
    2024-04-02
  • Python-OpenCV中的cv2.inpaint()函数的使用
    目录概念库函数实现代码概念 修复是图像插值。数字修复算法在图像插值,照片恢复,缩放和超分辨率等方面具有广泛的应用。 大多数人会在家里放一些旧的退化照片,上面有一些黑点,一些笔画等。你...
    99+
    2024-04-02
  • OpenCV中的图像修复代码分享
    这篇文章主要讲解了“OpenCV中的图像修复代码分享”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“OpenCV中的图像修复代码分享”吧!目录 效果图 原理 源码这篇博客将介绍如何通过Open...
    99+
    2023-06-20
  • Android基于OpenCV实现图像修复
    目录图像修复API操作效果源码图像修复 实际应用中,图像常常容易受损,如存在污渍的镜头、旧照片的划痕、人为的涂画(比如马赛克),亦或是图像本身的损坏。将受到损坏的图像尽可能还原成原...
    99+
    2024-04-02
  • C++OpenCV实现图像修复功能
    目录前言一、OpenCV inpaint二、源码三、效果显示前言 本文将使用OpenCV C++ 对有瑕疵的图像进行修复。OpenCV 提供了inpaint API可进行图像修复。 ...
    99+
    2024-04-02
  • Opencv中cv2.floodFill算法的使用
    目录一、 泛洪算法——floodFill函数原型二、简单应用三、应用,结合minareaRect一、 泛洪算法——floodFill函数原型 cv2.floodFill(img,...
    99+
    2024-04-02
  • 关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)
    前一篇研究了opencv二值化方法threshold的使用,但是这个方法也存在一定的局限性,假如有一张图存在明显的明暗不同的区域,如下图 可以看到左边部分因为整体偏暗,导致二值化后...
    99+
    2024-04-02
  • 如何使用cv2.imread()读取BGR图像
    这篇文章给大家介绍如何使用cv2.imread()读取BGR图像,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。opencv读取图像为b,g,r方法,比如img = cv2.imread("...
    99+
    2023-06-14
  • OpenCV中怎么使用图像像素
    这篇文章主要介绍了OpenCV中怎么使用图像像素的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇OpenCV中怎么使用图像像素文章都会有所收获,下面我们一起来看看吧。像素是计算机视觉中图像的重要属性。它们是表示图...
    99+
    2023-06-29
  • C++ OpenCV如何实现图像修复功能
    本篇文章给大家分享的是有关C++ OpenCV如何实现图像修复功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。前言下面将使用OpenCV C++ 对有瑕疵的图像进行...
    99+
    2023-06-26
  • OpenCV学习之图像的分割与修复详解
    目录背景一、分水岭法二、GrabCut法三、MeanShift法四、MOG前景背景分离法五、拓展方法六、图像修复总结背景 图像分割本质就是将前景目标从背景中分离出来。在当前的实际项目...
    99+
    2024-04-02
  • OpenCV中图像如何实现分割与修复
    这篇文章给大家分享的是有关OpenCV中图像如何实现分割与修复的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。背景图像分割本质就是将前景目标从背景中分离出来。在当前的实际项目中,应用传统分割的并不多,大多是采用深度...
    99+
    2023-06-29
  • OpenCV 读取图像imread的使用详解
    目录1、方法说明2、目前支持的文件格式3、flags参数说明4、案例教程1、方法说明 import cv2 as cv img1 =cv.imread(filename[, flag...
    99+
    2024-04-02
  • python-opencv-cv2.threshold()二值化函数的使用
    目录1.cv2.threshold()参数说明2.代码示例1.cv2.threshold()参数说明 cv2.threshold(src, thresh, maxval, type[...
    99+
    2022-11-13
    python-opencv python cv2.threshold() 二值化函数
  • 使用OpenCV为图像加水印的教程
    目录1. 什么是水印?2. 在 OpenCV 中调整图像大小3.使用图像创建水印参考 在本文中,我们将学习如何使用 OpenCV 为多个图像添加水印。 1. 什么是水印? 水印是有意...
    99+
    2024-04-02
  • python使用cv2库、下载opencv库的方法
    cv2库在opencv库内,因此需要下载opencv-python1、打开windows命令行: win+Rcmd 2、更新pip版本(不一定要): python -m pip i...
    99+
    2023-05-15
    python使用cv2库 python 下载opencv库
  • 详解在OpenCV中如何使用图像像素
    目录切片操作获取感兴趣区域的坐标值使用切片操作裁剪图像1.加载并显示原始图像2.获取图像的空间维度3.裁剪图像4.使用尺寸将部分图像设置为特定颜色。总结 像素是计算机视觉中图像的重要...
    99+
    2024-04-02
  • Python如何使用cv2.canny进行图像边缘检测
    目录使用cv2.canny进行图像边缘检测阈值对检测结果的影响sobel算子对检测结果的影响范数对检测结果的影响总结使用cv2.canny进行图像边缘检测 CV2提供了提取图像边缘的...
    99+
    2023-01-28
    Python使用cv2.canny cv2.canny图像边缘检测 Python图像
  • Opencv图像处理中如何使用mask
    这篇文章将为大家详细讲解有关Opencv图像处理中如何使用mask,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。图像基本运算图像的基本运算有很多种,比如两幅图像可以相加、相减、相乘、相除、位运算、平方根、...
    99+
    2023-06-14
  • 如何使用OpenCV实现图像增强
    本篇内容介绍了“如何使用OpenCV实现图像增强”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!本期将介绍如何通过图像处理从低分辨率/模糊/低...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作