• Python与机器视觉(x)图像修复


    本系列博客主要分享Python在机器视觉/计算机视觉下的编程应用
    cv2包是著名的视觉库OpenCV的Python实现

    图像修复

    很多时候遇到受损的图片我们需要利用机器视觉的手段对其进行修复,opencv中提供了inpaint函数实现了这一功能。

    1.先来看一个例子

    • 首先读入图片:
    import numpy as np
    import cv2 as cv
    img = cv.imread('src.jpg')
    polluted = cv.imread('polluted.png',0)
    

    在这里插入图片描述在这里插入图片描述
    分别是原图和污损图。

    • 下面我们使用阈值分割来得到污损图的掩膜:
    _,mask = cv2.threshold(cv2.cvtColor(pllute,cv2.COLOR_BGR2GRAY),10,255,cv2.THRESH_BINARY_INV)
    cv2.imshow('mask',mask);cv2.waitKey(1000);cv2.destroyAllWindows()
    

    得到如下的掩膜图;
    在这里插入图片描述

    • 最后调用函数对图像进行修复
    dst = cv.inpaint(polluted ,mask,3,cv.INPAINT_TELEA)
    cv2.imshow('inpainted',dst)
    cv2.imshow('src',src)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    在这里插入图片描述在这里插入图片描述
    左图是修复图,右图是原图。
    img from Animade

    2.参数解析

    图像修复函数inpaint主要参数如下:

    inpaint(src, inpaintMask, inpaintRadius, flags[, dst]) -> dst
    .   这是一个利用领域信息恢复图像的函数.
    .   
    .   src 为输入图像
    .   inpaintMask 为单通道二值图掩膜,其中非零位置为需要修复的位置
    .   dst  为输出图像,与输入大小等同 .
    .   inpaintRadius  为领域大小,在修复时考虑周围像素的范围
    .   修复方法的flag:
    .   -   **INPAINT_NS** [Navier-Stokes based方法](https://ieeexplore.ieee.org/document/990497)
    .   -   **INPAINT_TELEA** [Alexandru Telea方法](https://www.tandfonline.com/doi/abs/10.1080/10867651.2004.10487596)
    .   
    

    3.原理实现

    Navier-Stokes based方法
    论文摘要:这种方法利用了经典流体动力学中的思想,将等照度线连续的从待修补区域周围传播到修补区域中去。主要的观点在于将图像强度视为了二维不可压缩流的流函数(stream function),其中图像强度的拉普拉斯量为流体的旋量、并将它通过矢量场定义的流函数输运到待修补区域。最终得到的算法会通过连续照度来匹配受损区域的梯度矢量。它直接依赖于流体力学中的纳维叶斯托克斯方程,具有较强的理论和数值优势。

    Fast Marching Method
    这篇文章提出的是基于快速行进算法的图像修复,其主要思想则是基于沿图像梯度传播平滑估计器。图像的平滑主要来自于受损图像领域的加权平均。同时将缺失的区域视为水平集,并用FMM(Fast Marching Method)来描述为图像信息的传播。

    Image Prior
    目前深度学习方法对于图像修复也有了很大的进展
    在这里插入图片描述


    ref:
    1.OpencvDoc:https://docs.opencv.org/3.4/df/d3d/tutorial_py_inpainting.html
    2.Deeplearning:https://arxiv.org/pdf/1711.10925.pdf
    3.Code:https://github.com/atiyo/deep_image_prior
    4.Fast Marching:https://blog.csdn.net/seamanj/article/details/51991067

  • 相关阅读:
    2020.5.28.第十三周java上机练习
    2020.5.22第十二周java作业
    2020.5.21.第十二周java上机练习
    2020.5.15.java第十一周作业
    2020.5.14.第十一周上机练习
    leetcode02大数相加
    leetcode算法题01
    近期wxss总结
    近期Freecodecamp问题总结
    freecodecamp数字转化成罗马数字
  • 原文地址:https://www.cnblogs.com/Tom-Ren/p/9897788.html
Copyright © 2020-2023  润新知