来源:CSDN

AI 图像智能修复老照片效果惊艳到我了(附代码)_图像_区域 智能问答

作者:李秋键

本文约2957字,建议阅读9分钟。

本文先容基于深度学习的发展,打算机视觉在人工智能和深度学习的大背景下朝阳东升,个中图像处理技能便是最热门的运用之一。
最近一段韶光,图像处理技能中最受欢迎的必须是图像修复功能,一键修复老照片等App运用,在社交网络上掀起一股潮流。

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

早在文艺复兴期间,人们就开始修复一些中世纪的艺术品,其目的在于通过补充一些裂痕来使画面恢复原貌,这一事情就称之为"Inpainting"(修复,修饰)或"Retouching"。
M.Bertalmio首次提出许多图像修复能被简化为一个数学表达式,利用打算性能自动加以实现。
图像修复现已是打算机图形学和打算机视觉中的一个研究热点,在文物保护、影视绝技制作、虚拟现实、多余物体剔除(如***图像中删除部分人物、笔墨、小标题等)等方面有着重大的运用代价。

个中常见的修复方法有:

偏微分方程的方法:Bertalmio采取偏微分方程(PDE)的方法进行图像修复,取得了较好的效果。
用户需指定须要修复的区域,算法将待修补的区域边界的等值线外部的信息沿轮廓法向扩散到中间待修补的象素上。
该算法利用局部颜色的光滑度沿着等值线扩散,考虑了各向异性的扩散,以担保边缘处的边界连续,但该方法打算不稳定。
整体变分方法和基于曲率的扩散模型:整体变分方法(TV,TotalVariational)采取了欧拉-拉格朗日方程和各向异性的扩散,基于曲率的扩散模型(CDD,Curvature-DrivenDiffusion)方法是整体变分方的一种扩展,在扩散过程中考虑了轮廓的几何信息(曲率),可以处理较大的区域,但边界处每每很模糊。
高斯卷积核对图像进行滤波的方法:利用了高斯卷积核对图像进行滤波,能快速地修复破损区域,但该算法仅考虑了破损区域边缘一周的图像颜色值,使得其仅适用于破损区域为2-3个象素宽度的环境。
纹理合成的方法:纹理合成的方法,能较好地去除图像中的大块污斑,但由于算法运行韶光不是与掩模区域成正比,而是与图像大小成正比,因此修复韶光相对较长。

而本日我们就将借助Python实现我们的修图效果。

实验前的准备

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

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

修复程序处理一的搭建

1、图像处理第一步:

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

import cv2import numpy as nppath = "13.jpg"img = cv2.imread(path)hight, width, depth = img.shape[0:3]#图片二值化处理,把[240, 240, 240]~[255, 255, 255]以外的颜色变成0thresh = cv2.inRange(img, np.array([240, 240, 240]), np.array([255, 255, 255]))#创建形状和尺寸的构造元素kernel = np.ones((3, 3), np.uint8)

2、扩展修复区域:

识别到修复区域并根据相邻像素值进行扩展达到填补像素值修复图片的效果。
cv2.inpaint()函数紧张涉及两种算法。

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

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

详细代码如下:

#扩展待修复区域hi_mask = cv2.dilate(thresh, kernel, iterations=1)specular = cv2.inpaint(img, hi_mask, 5, flags=cv2.INPAINT_TELEA)cv2.namedWindow("Image", 0)cv2.resizeWindow("Image", int(width / 2), int(hight / 2))cv2.imshow("Image", img)cv2.namedWindow("newImage", 0)cv2.resizeWindow("newImage", int(width / 2), int(hight / 2))a=cv2.imshow("newImage", specular)cv2.imwrite("43.jpg",specular)cv2.waitKey(0)cv2.destroyAllWindows()修复程序处理二的搭建

1、图像处理第二步:

转换成hsv值,根据hsv值判断图片的前景和后景。
HSV是一种将RGB色彩空间中的点在倒圆锥体中的表示方法。
HSV即色相(Hue)、饱和度(Saturation)、明度(Value),又称HSB(B即Brightness)。
色相是色彩的基本属性,便是平常说的颜色的名称,如赤色、黄色等。
饱和度(S)是指色彩的纯度,越高色彩越纯,低则逐渐变灰,取0-100%的数值。
明度(V),取0-max(打算机中HSV取值范围和存储的长度有关)。
HSV颜色空间可以用一个圆锥空间模型来描述。
圆锥的顶点处,V=0,H和S无定义,代表玄色。
圆锥的顶面中央处V=max,S=0,H无定义,代表白色。
个中紧张用到的函数是cv2库中的cv2.cvtColor()函数,将RGB图像(在opencv中设计BGR图像)转换为HSV图像用到了参数cv2.COLOR_BGR2HSV。

详细代码如下:

import cv2import osimport numpy as npsta=0for file in os.listdir("cut_test"): sta=sta+1 print("正在处理"+"cut_test/" + file) img = cv2.imread("cut_test/" + file) #img=cv2.imread('1.jpg') rows,cols,channels = img.shape cropped = img[0:479, 0:cols] #转换hsv hsv=cv2.cvtColor(cropped,cv2.COLOR_BGR2HSV) # 图片二值化处理,把[240, 240, 240]~[255, 255, 255]以外的颜色变成0 thresh = cv2.inRange(hsv, np.array([90,10,125]), np.array([135,180,255])) erode = cv2.erode(thresh, None, iterations=2) dilate = cv2.dilate(erode, None, iterations=0) # 创建形状和尺寸的构造元素 kernel = np.ones((3, 3), np.uint8)

2、图像修复:

在扩展修复区域的根本上外加调度像素值图片处理。

个中堕落操作详细如下:

定义了一个十字形构造元素 实在是一个矩阵,我们知道在图片的堕落过程,对图片的每个点,利用这个构造扫描每一个点,用构造元素与其覆盖的二值图像做“与”操作,如果都为1,结果图像的该像素为1。
否则为0,堕落处理的结果是使原来的二值图像减小一圈。
利用的函数:cv2.erode(img,kernel);

膨胀操作详细如下:

利用同样的构造,对图片的每个点,利用这个构造扫描每一个点,用构造元素与其覆盖的二值图像做“与”操作,如果涌现1,结果图像的该像素为1。
否则为0,堕落处理的结果是使原来的二值图像扩大一圈。
利用的函数:cv2.dilate(img,kernel)

详细代码如下:

# 扩展待修复区域 hi_mask = cv2.dilate(dilate, kernel, iterations=1) specular = cv2.inpaint(cropped, hi_mask, -5, flags=cv2.INPAINT_NS) #合并 htich = np.vstack((specular, img[479:rows, 0:cols])) ''' blue=[] #获取mask,调度lower中h掌握颜色 lower_blue=np.array([90,10,125]) upper_blue=np.array([135,180,255]) mask = cv2.inRange(hsv, lower_blue, upper_blue) erode=cv2.erode(mask,None,iterations=1) dilate=cv2.dilate(erode,None,iterations=1) #堕落膨胀 erode=cv2.erode(mask,None,iterations=1) cv2.imshow('erode',erode) dilate=cv2.dilate(erode,None,iterations=1) cv2.imshow('dilate',dilate) for i in range(rows): for j in range(cols): if dilate[i,j]==255: blue.append([i,j]) for w in blue: x=w[0] y=w[1] img[x,y]=[255,255,255] ''' cv2.imwrite("dels_test/" + str(sta) + ".jpg", htich)''' cv2.imshow('Mask', img) cv2.waitKey(0) cv2.destroyAllWindows()'''

终极效果如图所示(右边是修复效果):

怎么样?这修复效果还不错吧?赶紧动手练起来,节制一门千万修图师技能吧!

—完—

想要得到更多数据科学领域干系动态,诚邀关注清华-青岛数据科学研究院官方微信"大众年夜众平台“ 数据派THU ”。