iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >OpenCV中的图像修复代码分享
  • 945
分享到

OpenCV中的图像修复代码分享

2023-06-20 21:06:42 945人浏览 八月长安
摘要

这篇文章主要讲解了“OpenCV中的图像修复代码分享”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“OpenCV中的图像修复代码分享”吧!目录 效果图 原理 源码这篇博客将介绍如何通过Open

这篇文章主要讲解了“OpenCV中的图像修复代码分享”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“OpenCV中的图像修复代码分享”吧!

目录

这篇博客将介绍如何通过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 流体力学修复效果 如下:

OpenCV中的图像修复代码分享

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

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

OpenCV中的图像修复代码分享

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

OpenCV中的图像修复代码分享

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

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 cv2import 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 = 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 Nonedef 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()

感谢各位的阅读,以上就是“OpenCV中的图像修复代码分享”的内容了,经过本文的学习后,相信大家对OpenCV中的图像修复代码分享这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: OpenCV中的图像修复代码分享

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

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

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

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

下载Word文档
猜你喜欢
  • OpenCV中的图像修复代码分享
    这篇文章主要讲解了“OpenCV中的图像修复代码分享”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“OpenCV中的图像修复代码分享”吧!目录 效果图 原理 源码这篇博客将介绍如何通过Open...
    99+
    2023-06-20
  • OpenCV中图像如何实现分割与修复
    这篇文章给大家分享的是有关OpenCV中图像如何实现分割与修复的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。背景图像分割本质就是将前景目标从背景中分离出来。在当前的实际项目中,应用传统分割的并不多,大多是采用深度...
    99+
    2023-06-29
  • OpenCV图像修复cv2.inpaint()的使用
    目录1. 效果图2. 原理3. 源码这篇博客将介绍如何通过OpenCV中图像修复的技术——cv2.inpaint() 去除旧照片中的小噪音、笔划等。并提供一个可交互式的程序,利用Op...
    99+
    2024-04-02
  • OpenCV学习之图像的分割与修复详解
    目录背景一、分水岭法二、GrabCut法三、MeanShift法四、MOG前景背景分离法五、拓展方法六、图像修复总结背景 图像分割本质就是将前景目标从背景中分离出来。在当前的实际项目...
    99+
    2024-04-02
  • OpenCV 图像分割实现Kmean聚类的示例代码
    目录1 Kmean图像分割2 流程3 实现1 Kmean图像分割 按照Kmean原理,对图像像素进行聚类。优点:此方法原理简单,效果显著。缺点:实践发现对于前景和背景颜色相近或者颜色...
    99+
    2024-04-02
  • Android基于OpenCV实现图像修复
    目录图像修复API操作效果源码图像修复 实际应用中,图像常常容易受损,如存在污渍的镜头、旧照片的划痕、人为的涂画(比如马赛克),亦或是图像本身的损坏。将受到损坏的图像尽可能还原成原...
    99+
    2024-04-02
  • 3段Python图像处理的实用代码的分享
    目录前言边缘检测将照片变成素描风格判断形状前言 今天给大家分析3个计算机视觉方向的Python实用代码,主要用到的库有: opencv-pythonnumpypillow 要是大家所...
    99+
    2024-04-02
  • C++OpenCV实现图像修复功能
    目录前言一、OpenCV inpaint二、源码三、效果显示前言 本文将使用OpenCV C++ 对有瑕疵的图像进行修复。OpenCV 提供了inpaint API可进行图像修复。 ...
    99+
    2024-04-02
  • openCV实现图像融合的示例代码
    目录1. 概念2. 流程3 代码1. 概念 图像融合: 两幅图片叠加在一起,形成前景背景的效果。 2. 流程 (1)读入要融合的两幅图片。(2)把两幅图片调整到统一大小,方便下一步叠...
    99+
    2024-04-02
  • OpenCV-Python 对图像的基本操作代码
    import cv2 as cv import numpy as np import matplotlib.pyplot as plt # 设置兼容中文 plt.rcParams...
    99+
    2024-04-02
  • 基于Opencv的图像卡通化实现代码
    OpenCV的全称是:Open Source Computer Vision Library。OpenCV是一个基于(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windo...
    99+
    2024-04-02
  • OpenCV实战之图像拼接的示例代码
    目录背景实现步骤一、读取文件二、单应性矩阵计算三、图像拼接总结背景 图像拼接可以应用到手机中的全景拍摄,也就是将多张图片根据关联信息拼成一张图片; 实现步骤 1、读文件并缩放图片大小...
    99+
    2024-04-02
  • C++ OpenCV如何实现图像修复功能
    本篇文章给大家分享的是有关C++ OpenCV如何实现图像修复功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。前言下面将使用OpenCV C++ 对有瑕疵的图像进行...
    99+
    2023-06-26
  • python中的opencv 图像分割与提取
    目录图像分割与提取用分水岭算法实现图像分割与提取算法原理相关函数介绍分水岭算法图像分割实例交互式前景提取图像分割与提取 图像中将前景对象作为目标图像分割或者提取出来。对背景本身并无兴...
    99+
    2024-04-02
  • OpenCV图像旋转、平移、缩放操作代码
    目录1 缩放图片2 翻转图片2.1 垂直翻转2.2 水平翻转2.3 水平垂直翻转3 平移图片本文是 OpenCV图像视觉入门之路的第7篇文章,本文详细的进行了图像的缩放 cv2.re...
    99+
    2022-12-27
    OpenCV 图像旋转 OpenCV 图像平移 OpenCV 图像缩放
  • C++使用opencv读取图片的操作代码(图像处理)
    目录代码理解全部代码读取结果参考代码理解 using namespace cv; 解释:加入此代码,后面就不需要在函数前加入cv:: 如从cv::imread(),可以直接写成imr...
    99+
    2024-04-02
  • python中的opencv图像梯度实例分析
    本文小编为大家详细介绍“python中的opencv图像梯度实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“python中的opencv图像梯度实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。图像梯...
    99+
    2023-06-30
  • css画太极图代码分享
    这篇文章主要介绍“css画太极图代码分享”,在日常操作中,相信很多人在css画太极图代码分享问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”css画太极图代码分享”的疑惑有所帮...
    99+
    2024-04-02
  • opencv中如何将图像覆盖到另一图像的特定部分
    问题内容 我有下面的图像,我想在图像的最右侧覆盖一个黑色补丁。因此,我在下面的代码中将两个图像的大小调整为特定大小,并仅获取覆盖层的非白色部分并将其粘贴到特定的 x,y 坐标上,但没有...
    99+
    2024-02-05
  • python中的opencv 图像梯度
    目录图像梯度Sobel理论基础计算水平方向偏导数的近似值计算垂直方向偏导数的近似值Sobel算子及函数使用方向计算x方向和y方向的边缘叠加Scharr算子及函数使用Sobel算子和S...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作