麻辣小说网 > 玄幻奇幻 > 数学心 > 第五百七十六章 AI 智能修复老照片,效果惊艳到我了!

第五百七十六章 AI 智能修复老照片,效果惊艳到我了!

    图像识别技术本身的原理并不复杂,信息的处理是这一技术的关键点所在。近年来,由于深度学习的发展,大大提高了图像识别的准确率,深度学习通过大量图像数据信息特征的积累与分析,可自动完成特征提取和图像匹配等任务。最近一段时间,最受欢迎的必须是图像修复功能。

    早在文艺复兴时期,人们就开始修复一些中世纪的艺术品,其目的在于通过填补一些裂缝来使画面恢复原貌,这一工作就称之为“inpainting“(修复,润饰)或“retouching“。talmio首次提出许多图像修复能被简化为一个数学表达式,利用计算机能自动加以实现。图像修复现已是计算机图形学和计算机视觉中的一个研究热点,在文物保护、影视特技制作、虚拟现实、多余物体剔除(如视频图像中删除部分人物、文字、小标题等)等方面有着重大的应用价值。

    其中常见的修复方法有:

    偏微分方程的方法:bertalmio采用偏微分方程(pde)的方法进行图像修复,取得了较好的效果。用户需指定需要修复的区域,算法将待修补的区域边界的等值线外部的信息沿轮廓法向扩散到中间待修补的象素上。该算法利用局部颜色的光滑度沿着等值线扩散,考虑了各向异性的扩散,以保证边缘处的边界连续,但该方法计算不稳定。

    整体变分方法和基于曲率的扩散模型:整体变分方法(tv,totalvariational)采用了欧拉-拉格朗日方程和各向异性的扩散,基于曲率的扩散模型(cdd,curvature-drivendiffusion)方法是整体变分方的一种扩展,在扩散过程中考虑了轮廓的几何信息(曲率),可以处理较大的区域,但边界处往往很模糊。

    高斯卷积核对图像进行滤波的方法:利用了高斯卷积核对图像进行滤波,能快速地修复破损区域,但该算法仅考虑了破损区域边缘一周的图像颜色值,使得其仅适用于破损区域为2-3个象素宽度的情形。

    纹理合成的方法:纹理合成的方法,能较好地去除图像中的大块污斑,但由于算法运行时间不是与掩模区域成正比,而是与图像大小成正比,因此修复时间相对较长。

    而今天我们就将借助python实现我们的修图效果。

    实验前的准备

    首先我们使用的python版本是365。所测试的系统有windows10,windows7,linux系统以及苹果系统。从这点也可以看出python多平台和多拓展性、易于迁移的优点。

    所使用的的python库有cv2库,目的是用来读取图片,处理图片像素值和保存图片等;numpy用来对读取过来的像素值矩阵进行运算。

    修复程序处理一的搭建

    1、图像处理第一步:

    首先我们所借助常用的opencv处理手段进行处理图片。首先进行的是图片二值化处理和创建结构元素,其中详细代码如下:

    importcv2

    importnumpyasnp

    path=““

    img=ead(path)

    hight,width,depth=pe[0:3]

    #图片二值化处理,把[240,240,240]~[255,255,255]以外的颜色变成0

    thresh=ange(img,ay([240,240,240]),ay([255,255,255]))

    #创建形状和尺寸的结构元素

    kernel=s((3,3),t

    2、扩张修复区域:

    识别到修复区域并根据相邻像素值进行扩张达到弥补像素值修复图片的效果。aint()函数主要涉及两种算法。

    一种算法是从该区域的边界开始,然后进入区域内,逐渐填充边界中的所有内容。它需要在邻近的像素周围的一个小邻域进行修复。该像素由邻居中所有已知像素的归一化加权和代替。选择权重是一个重要的问题。对于靠近该点的那些像素,靠近边界的法线和位于边界轮廓上的像素,给予更多的权重。

    另一种是基于流体动力学并利用偏微分方程。基本原则是heurisitic。它首先沿着已知区域的边缘行进到未知区域(因为边缘是连续的)。它继续等照片(连接具有相同强度的点的线,就像轮廓连接具有相同高度的点一样),同时在修复区域的边界处匹配渐变矢量。为此,使用来自流体动力学的一些方法。获得颜色后,填充颜色以减少该区域的最小差异。

    详细代码如下:

    #扩张待修复区域

    hi_mask=ate(thresh,kernel,iterations=1)

    specular=aint(img,hi_mask,5,flags=aint_telea)

    edwindow(“image“,0)

    izewindow(“image“,int(width/2),int(hight/2))

    how(“image“,img)

    edwindow(“newimage“,0)

    izewindow(“newimage“,int(width/2),int(hight/2))

    a=how(“newimage“,specular)

    rite(““,specular)

    tkey(0)

    tr