灰度图像的彩色复原方法 ——以人脸着色为例

2023-11-20

灰度图像的彩色复原方法 ——以人脸着色为例

代码文件下载地址

摘要:灰度图像彩色复原在图像修复领域有广泛的应用,由于其涉及从低纬度空间向高纬度空间的映射,故而修复效果存在差异。本文以人脸为例研究灰度图像的彩色复原方法,在主流灰度图像彩色修复算法的基础上,创新性的引入面部色彩分类指标,其依据人脸面部纹理特征将面部肤色分为36类,然后基于纹理分类指标创建模型,使得模型能够对灰度图像依据面部纹理特征,通过特征提取、灰箱模型、模拟上色进行分类着色。最后对模型进行数值测试,测试结果优良。
关键词:灰度图像;人脸着色;卷积神经网络;MATLAB

目 录

1 引 言 1
2 问题分析及模型思路 2
 2.1 问题详述 2
  2.1.1 灰度图介绍 2
   2.1.2 彩色图介绍 3
  2.1.3 面临问题 3
 2.2 建模思路 3
3 使用工具及数据获取 4
 3.1 使用计算工具 4
 3.2 人脸图像获取 4
 3.3 人脸图像预处理 4
4 面部色彩分类指标构建 5
 4.1 面部像素判断 5
 4.2 色彩空间转换 6
 4.3 面部色彩指标构建 7
 4.4 面部色彩标记 10
5 卷积神经网络模型 11
 5.1 卷积神经网络介绍 11
 5.2 卷积神经网络模型搭建 11
 5.3 参数预设 11
 5.4 卷积神经网络结构 12
  5.4.1 输入层 12
  5.4.2 卷积层 13
  5.4.3 池化层 15
  5.4.4 全连接层 16
 5.5 卷积神经网络训练 17
  5.5.1 池化层到卷积层的反向传播 17
  5.5.2 卷积层到池化层的反向传播 17
6 参数调整及模型误差 19
 6.1 使用预设参数对模型进行训练 19
 6.2 调整参数修正模型 20
  6.2.1 第一次修正 21
  6.2.2 第二次修正 22
7 人脸彩色化实例及对比 23
 7.1 新模型图像着色 23
 7.2 模型对比 25
8 总结 25
9 致谢 27
参考文献 28
附录 29
 附录一: 29
 附录二: 30

1 引 言

   灰度图像彩色化在现代社会有着较多的应用。例如旧照片色彩还原、古画等文物色彩修复、嫌疑人画像着色等领域。
   在上世纪末本世纪初,主要灰度图着色手段为基于色彩标注传递[1]的思想,其核心认为小范围图像中,色彩的色值不会发生变化。其过程在于对原始灰度图像进行色彩标注,后依据图像内容轮廓进行分割,在同一子图像中将标记色进行传递,最后拼合所有子图像达到图像整体着色的目的。该过程中,着色效果的主要影响因素在于两点:一是标记者对图像的把控与对于标记色彩的选择;二是图像不同色值的边缘轮廓是否清晰。若标记者错误标记,则色彩也会错误传递,同样若两个色值间为渐变过渡则着色效果也会大为降低。
在这里插入图片描述

   基于传递的思想,设计了基于图像分割与色彩扩展的色彩传递算法[2],其核心思想也是色彩传递,不同之处在于其色彩来源不再是由使用者手工标注,而是由一张给定的参考图像传递。首先对参考图像及目标图像具有相似纹理的色块进行分割,然后将参考子图像的色值经过一定变换后传递到目标子图像,最后进行汇总达到整体着色的目的。该过程中,主要影响为参考图像是否与目标图像相似。就一般而言,对于相似图像查找较为困难,错误的选择参考图像也定会产生着色效果的较大偏差。
在这里插入图片描述

现代随着机器深度学习的发展,对于灰度图像,主要的着色方法为卷积神经网络法[3]。上述两种方法主要缺点在于都需要人机交互,过程繁琐,卷积神经网络法很好的克服这一点。其主要过程为:通过卷积神经网络构建初始模型,然后对大量图片进行自我训练,提取诸多图像特征,建立特征与色值的灰箱关系。然后给定一张目标图片,模型自己通过卷积层对图像特征进行提取,然后匹配色彩,反向传递到原始图片,完成灰度图着色的目标。但其对于部分精细化图像如人脸着色效果远不如上述两种方法,着色偏差较大。
在这里插入图片描述

   本文将基于卷积神经网络模型建立一套新的灰度图像着色模型,使之能够完成更为细致化的图像着色工作。由于图像处理对硬件设备要求较高,故而受硬件设备影响,在本文中,将选取人脸图像为例对灰度图像着色模型进行研究。
   人脸识别在目前有着较好应用,且样本数据较其他数据更方便采集,可使用爬虫程序从网站百度图片中大量获取;对于复杂度而言,人的面部肤色[4]粗略可依据人种分为黑种人、棕种人、黄种人以及白种人四类,也可建立更为细致的肤色表,将色值相近的归于同一类色彩,然后基于肤色表进行更详细的划分。故而在下述模型建立过程中,将以人脸为例进行灰度图像着色。
   该论文包含以下内容:第一部分引言,第二部分问题分析及模型思路,第三部分使用工具及数据获取,第四部分面部色彩分类指标构建,第五部分卷积神经网络模型,第六部分参数调整及模型误差,第七部分人脸彩色化实例及对比,第八部分总结及第九部分的感谢。

2 问题分析及模型思路

2.1 问题详述

2.1.1 灰度图介绍

   灰度图又称为灰阶图,是将纯黑色到纯白色的过渡色彩划分为256阶,每一阶表示一个特定的明度。灰度图中只包含亮度信息,不包含色彩信息,故而其信息量较彩色图像会大为减少。
在现代计算机中,对于灰度图像一般存储在一个二维矩阵中,矩阵内的每一个元素都表示一个特定的阶,矩阵元素值的种类不会超过256个。在RGB色彩模式中,可以数学表示为:
x∈{x|0≤x≤255,x∈N}	(2.1)

   其中x表示灰度图像中的任意一个像素,N表示自然数。

2.1.2 彩色图介绍

   彩色图是多光谱图像的一种特殊情况,主要对应的是人眼视觉的三原色即红色波段、绿色波段以及蓝色波段。相较于灰度图,彩色图不仅包含明度信息,还包含有色相信息与纯度信息,一般而言,色相与纯度可以结合称为色值。
   在计算机中,对于彩色图像一般存储在一个三维矩阵中,该三维矩阵由三个相同维度的二维矩阵构成,彩色图像中每个像素显示的色值均由三个二维矩阵所对应位置的数值表示。在RGB色彩模式中,可以数学表示为:
(x,y,z)∈{(x,y,z)|0≤x≤255,x∈N,0≤y≤255,y∈N,0≤z≤255,z∈N} (2.2)

   其中x,y,z表示三层二维矩阵中的同一位置的一个像素,N表示自然数。

2.1.3 面临问题

   在从灰度图像到彩色图像的转变过程中,涉及到由二维空间向三维空间的投影。由于单一像素的信息量较少,故而要使用其他方法获取更多的信息完成对色值的预测,并且要尽可能使得预测结果与实际结果误差小,使模型在面向人脸的色彩预测适用范围更广。

2.2 建模思路

   人眼对于灰度图像的上色一般经历三步过程:首先是观察目标图像、从图像纹理中寻找图像特征,然后依据此前所接触到的普遍规律,进行惯性思考,在大脑中对图片特征进行颜色匹配,最后进行模拟上色。
   例如看到一颗大树的灰度图像,一般会想它的树冠是绿色的,它的树枝是棕黑色的。这一步思考的前提是在观察者看到这张图片前,见过很多树,得到一个定向思维,树叶的颜色是绿色的,树枝的颜色是棕黑色的。当然,人眼在特征提取中一般只会提取较为明显的特征,故而存在错误判断,假如对图像进行更细致的观察,通过树叶的形状认识到这是一颗枫树,那么它的树冠就不一定是绿色,而有可能是红色,这是因为在大脑此前构建的规律认知中,认为枫树树叶的颜色是红色的。
   本文基于以上思考,在算法设计中,首先确定人脸位置,然后获取面部特征,对面部区域进行框选,然后从面部提取更加细微的特征,建立特征向量,使之能够确定其面部色彩种类,然后使用海量彩色图像进行训练,使之建立特征向量与色彩的灰箱关系,在给定一张灰度图像后,可经过特征提取、灰箱模型、模拟上色三步完成上色过程。

3 使用工具及数据获取

3.1 使用计算工具

   本文主要使用的工具为python与MATLAB。
   Python是一种可跨多个平台的计算机程序设计语言,具有简单易懂、开源等优点。Python具有极其强大的第三方库,库中涉及数学、物理、生物、化学等多个领域的计算函数,故而其具有非常高的开发效率,充分利用第三方库,可大大降低开发周期。
   MATLAB是由美国公司MathWorks所推出商业性质的数学软件,用于数据可视化、数据分析、数值计算以及算法开发的高级计算语言。MATLAB具有极其高效的数值计算功能与符号计算功能,并且配备有诸多安全可靠的工具箱为使用者提供更便捷的数据处理工具。

3.2 人脸图像获取

   使用python基于scrapy框架[5][6]编写爬虫程序,从百度图片中爬取大量包含人脸的彩色写真图像,重命名后保存至文件夹。
   Scrapy是由Python编写的快速、高层次的web数据抓取框架,其由Scrapy Engine(引擎)、Scheduler(调度器)、Downloader(下载器)、Spider(爬虫)、Item Pipeline(管道)、Downloader Middlewares(下载中间件)及Spider Middlewares(Spider中间件)七部分组成,可灵活对各部分进行修改补充编写功能强大的网络爬虫。

3.3 人脸图像预处理

   由于爬虫从网页上爬取图像不仅包含人脸部分,还包含身体部分、背景部分等干扰图像,为降低其他图像对人脸色彩的干扰,为后续工作做准备,故而需要对各张图像的人脸部分进行框选。
在python的第三方库中,Opencv[7][8]是一个强大的图像处理和计算机视觉库,其在计算机视觉领域研究中必不可少。Opencv库中,有自带的人脸识别提取分类器
Haarcascade_frontalface_default.xml与面部68特征点坐标提取分类器
shape_predictor_68_face_landmarks.dat。
   使用人脸识别提取分类器对所抓取的网络图像进行初步处理,截取面部图像刨除干扰图像,统一缩放使大小为150×150的方形图像,然后归档;再使用面部68特征点坐标提取分类器对图像内面部特征点进行提取,将特征点坐标保存至txt文档后归档。
在这里插入图片描述

4 面部色彩分类指标构建

4.1 面部像素判断

   由于本文重点研究面部肤色与面部纹理特征的关系,故而需要借助68特征点勾勒出面部区域。
   在68特征点中,提取出面部外轮廓点集,以进行拉格朗日插值。
   由于面部68特征点构图为闭合多边形,并非函数关系,故而对其进行拆分,将其分为上下两部分,且对于同一横坐标下对应多个纵坐标的数值进行舍弃,使所得坐标点可进行拉格朗日插值,构建面部轮廓。

在这里插入图片描述

   其中x为所求y值的对应横坐标。
   在进行插值过程中,由于部分图像面部有所缺失,故而存在插值点在图像范围之外,即存在部分越界点,对于此类问题,进行如下处理:
   通过确定横坐标范围,对纵坐标低于0的及超过150的坐标作出
在这里插入图片描述

   由上对于任意图像,均可获取由点构成的面部封闭轮廓,在后续计算中,对任意满足在面部的像素坐标(x,y),其必然满足
在这里插入图片描述

   其中min⁡〖〖 l〗_j (x)〗表示在横坐标为x时的最小临界值,max⁡〖〖 l〗_j (x)〗表示在横坐标为x时的最大临界值。
由此可判断一点是否在面部,而非其他位置。

4.2 色彩空间转换

   一般我们所浏览的图像,其色彩模式为RGB模式。
   RGB色彩模式[9]是一种工业颜色标准。其有三层通道,分别为红色通道(red)、绿色通道(green)以及蓝色通道(blue)。取三种通道英文的首字母命名。每层通道均有256种等级的亮度,在计算机中,用0~255表示。从理论分析,RGB色彩模式可以表示出256^3即16777216种颜色,基本满足人类肉眼对色彩的需求。
   在人眼的视网膜中,主要包含有两种细胞,分别为视锥细胞与视杆细胞 ,其中视锥细胞约有700万,视杆细胞约有1亿。视锥细胞光敏感度低,强光刺激才能引起兴奋,但具有分辨颜色的能力。视杆细胞则对弱光敏感,却不具备分辨颜色的能力。故而人眼对色值的敏感度约为7%,对亮度的敏感度为93%。
   灰度图像实质为亮度图像,若使用RGB色彩模式,则需要对R、G、B三个通道进行预测,在预测过程中势必丢失部分信息。为尽可能的保留原有灰度信息,故而使用Lab色彩模式。
   Lab色彩模式[10]是根据CIE在1931年制定的定义颜色的国际标准上建立,它与设备无关,与生理有关。Lab色彩模式由亮度(L)及a、b两个颜色通道组成。Lab色彩模式既不依赖于光线,也不依赖于颜料,它是一个在理论上包含了人肉眼可以观察的所有颜色的色彩模式。Lab色彩空间中的L通道用于表示像素的亮度,其取值范围为0到100,对应表示从纯黑到纯白;a通道表示从红色色值到绿色色值的范围,值的范围127到-128,b通道则表示从黄色色值到蓝色色值的范围,值的范围127到-128。
RGB色彩空间在与Lab色彩空间在色彩转化时,需要借助XYZ颜色空间。
   从RGB色彩空间到Lab色彩空间 :
在这里插入图片描述
在这里插入图片描述

4.3 面部色彩指标构建

   为减少运算量,认为面部像素全部存在于面部68特征点构成的闭合多边形内,故而只需对满足下式的点进行位置判断

在这里插入图片描述

   其中φ_x表示68特征点中由x坐标构成的集合,φ_y表示68特征点中由y坐标构成的集合。
   对Lab格式图片面部各层进行提取统计,为方便观察,截取如下25例样本图像,统计结果如下:
在这里插入图片描述
在这里插入图片描述

   可以从分布图中发现,L层面部像素值分布分散,但a层与b层面部像素值分布较为集中,说明人类面部肤色色值相近,且与样本所接受的环境光照无关。但依然可以看到a层与b层面部像素值分布情况存在略微差异,说明可以依据此差异,对人脸面部色彩进行分类。
   通过图像,直观的发现在a层的面部像素值基本满足有50%介于1025间,b层面部像素值满足有50%介于1025间,故而以3为单位,将a层数据分为6组,若a层面部像素值均值属于那组范围,则其值可近似认为是组的对应值,对应值取各范围内的中位数,其公式如下:
在这里插入图片描述

   在亮度L=50时,其对应的色卡如下图所示:
在这里插入图片描述

   可以看出,色卡左侧部分对应黑种人的肤色,右侧部分对应白种人的肤色,下侧部分对应黄种人的肤色。颜色符合直观感受,故而指标构建合理。
   由于指标由a、b两个值构成,不方便标记,故而对其进行处理,使用1到36间的数字对各个色值进行标记替代,可得下表:
在这里插入图片描述

   表格中依据MATLAB存储数组方式即先行后列进行数字递增替代,此方法有助于有序的进行指标替换。

4.4 面部色彩标记

   在完成指标体系建立后,使用MATLAB对图片面部色彩进行标记。
   依据68特征点提取出图像面部像素坐标,对图像a、b层像素分别做统计得到平均值,然后通过替换表将结果替换为数字后存储在一个一维向量中备用。

5 卷积神经网络模型

5.1 卷积神经网络介绍

   卷积神经网络[11]是一种前馈性质的神经网络,其包含有卷积计算且具有深度结构,在深度学习中应用广泛。由于卷积神经网络具有表征学习能力,能够按其阶层结构对输入信息进行平移不变分类,因此也被称为“平移不变人工神经网络”[12]。
   卷积神经网络是仿照生物的视知觉机制建立的,即可以进行监督性学习也可以进行非监督性学习。由于在卷积神经网络隐含层内的卷积核参数实行共享机制且层与层间的连接具有稀疏性,故而使得卷积神经网络具有使用较小的计算量完成对格点化特征如音频、像素的学习,且学习结果具有稳定的效果,对于数据也没有其他额外的特征工程要求。

5.2 卷积神经网络模型搭建

   使用matlab卷积神经网络工具箱,搭建一个包含6层的卷积神经网络模型,其结构如下图所示:
在这里插入图片描述

其中,模型各层依次为输入层、卷积层1、池化层1、卷积层2、池化层2以及最后的全连接层。

5.3 参数预设

   由于输入图像尺寸为150×150,故而依据经验,对参数进行如下预设:
   卷积层1:包含有6个卷积核,卷积核尺寸都为25,补零层数为1;
   池化层1:池化步长为2;
   卷积层2:包含有12个卷积核,卷积核尺寸都为25,补零层数为1;
   池化层2:池化步长为2;
   由于输入图像为二维灰度图像,故而其深度为1,设置训练次数为一次,运行一次输入30张图像数据。
   参数相关内容后文将进行详细介绍。

5.4 卷积神经网络结构

5.4.1 输入层

   输入层即为整个神经网络的输入,在本文的卷积神经网络中,它代表了一张人脸图像的像素矩阵。像素矩阵的长和宽代表了图像的长和宽。在本文所使用到的灰度图像,图像的深度为1,故而每个输入都仅有1层。从输入层开始,卷积神经网络通过不同的子结构不停的将上一层的二维矩阵转化为下一层的二维矩阵,直到全连接层。
   输入前需要对数据进行规范化操作,使得图像数据格式满足卷积神经网络模型输入格式及运算格式。
   首先将面部样本图像从RGB色彩模式灰度化,受制于MATLAB读取RGB色彩模式下图像的存储格式为unit8,无法进行浮点运算,故而对存储格式进行强制转化,转化为double格式,再使用公式 进行灰度化:

在这里插入图片描述

   其中Gray为输出灰度图像,R为RGB色彩的红色通道,G为RGB色彩的绿色通道,B为RGB色彩的蓝色通道。
   灰度图像的深度为1,其大小在此前已做限制,限制为150×150大小,即获取结果为150×150的二维矩阵。
   为提取图像边界特征,matlab的卷积神经网络工具箱会自动为图像进行边缘补零,在完成卷积计算后产生的特征图大小为:

在这里插入图片描述

   其中w为输入矩阵的大小,k为卷积核的大小,s为卷积步幅,p为补零层数。
   由于预设参数需要进行两次卷积及两次池化,而特征图像大小不存在为非整数,故而对于输入图像,必须满足:

在这里插入图片描述

   其中w为输入矩阵的大小,p_1为卷积层1的补零层数,k_1为卷积层1的卷积核大小,s_1为卷积层1的卷积步幅,c_1为池化层1的池化步幅度,p_2为卷积层2的补零层数,k_2为卷积层2的卷积核大小,s_2为卷积层2的卷积步幅,c_2为池化层2的池化步幅度,N^*为非零自然数。
   将预设参数代入判断,发现所得结果不为非零自然数,故而在输入图片中手工补零一层,此时输入图像大小为152×152,代入计算其结果满足为非零自然数。
   再将从百度图库中采集到的100份样本图像分为两部分,其中一部分包含80张图像,它将作为训练图像集对卷积神经网络进行训练,另一部分包含剩下的20张图像以及训练图像集中的20张图像总计40张图像构成测试图像集,它将对卷积神经网络最后分类结果进行判断。将训练图像集命名为train_x,将测试图像集命名为text_y。
   同时构建分类矩阵,由于此前所做的统计指标在模型中无法被理解,故而需要进一步转化为模型可理解的二值矩阵。
   对于训练图像集train_x,我们构建80×36的全零矩阵train_y,使用公式:

在这里插入图片描述

   其中i表示第i张图片,ι表示该图片所属的分类指标。
   由此可构建一个由0、1组成的二值稀疏矩阵,矩阵每一行表示一张图像,每一列表示一个类别。
   同理,对于测试图像集text_x,我们构建40×36的全零矩阵text_y,使用公式:

在这里插入图片描述

   其中i表示第i张图片,ι表示该图片所属的分类指标。

5.4.2 卷积层

   卷积层是卷积神经网络中的核心结构。卷积层的目的在于在减少参数的同时保留图像特征。为达到这一目的,卷积层有两个重要思想,分别为局部连接与权值共享。
   局部连接:所有的神经元仅仅与输入神经元的一块区域相关联,这块局部的区域称为感受野。这种思维受启发于生物学里面视觉神经系统的结构,视觉皮层的神经元在进行信息感知时就是通过接受局部信息完成的。具体而言,局部连接可以解释为在对于目标图像进行卷积操作的过程中,神经元从空间维度看是局部连接,但在深度上却是全连接。在模型中的二维灰度图像同样是局部像素之间的关联性较强。这种局部连接的思想保证了完成训练后的卷积核对于图像中任意位置的输入特征都能够有着明显的响应。
   权重共享:在卷积层中,计算目标图像同一个深度的神经元时所采用的卷积核是共享的。这样可以极大的减少计算参数。直观来讲,共享权重讲是非常有意义的,这样可以保证图片边界处的特征信息与特征信息在图片中任意位置无关。但是权值共享在一些特殊场景中是无意的,比如所输入的图像是矿泉水瓶,需要从水瓶标签处与瓶盖处学到不同的信息,而标签和瓶盖位于不同的位置,若进行权值共享则毫无意义。要值得注意的是,权重仅仅对于同一深度的神经元是共享的,在不同深度下,权值不会共享。
   在建立的模型中,单条数据为152×152像素的图片,如此而来共有2万余个隐藏神经元,若将它们进行全连接,使得每个隐藏层的神经元都连接着图像中的每一个像素点,这样共有152×152×23104即53.4亿个连接,即有53.4亿个权值参数,如此而来所需要的计算工作是非常庞大的,故而先进行局部连接,假设局部感受野是25×25,如此而来2万余个隐藏神经元的连接数目就会减少到不足100万,再运用权值共享的思想,假设每个神经元的36个参数是相同的,如此而来,参数减少至36个,同时尽可能多的保留了原始图像的特征。
   由于图像像素之间是离散关系,故而使用离散条件下的卷积公式:
在这里插入图片描述

   完成卷积运算后,使用激活函数Sigmoid去除数据中的冗余。Sigmoid函数:
在这里插入图片描述

   Sigmoid函数可以很容易的抑制误差,尤其是相差比较大的误差。

5.4.3 池化层

   池化层不同于卷积层会改变图像矩阵的深度,其作用在于缩小图像矩阵的大小,减少后续计算工作。故而池化层在某种程度上也可以看成一个过滤器,实现一个采样的功能。池化层的主要的思想是,重点提取目标矩阵中具有某种倾向的特征,例如最大池化法对应的是更明显的边界特征;平均池化法对应的是更加平滑的特征。
   池化过滤器与卷积层中的过滤器有所不同,池化过滤器参数较卷积过滤器参数数量大为减少,仅包含两个参数,分别是过滤器的大小与池化操作的步长,且不同的通道单独使用池化层,故而输入通道数目与输出通道数目是相同的。
   池化的方法有最大池化法、平均池化法等多种方法。
   最大池化法:最大池化法即提取出目标矩阵中过滤器范围内元素的最大值,对其他元素进行舍弃。
在这里插入图片描述

   平均池化法:平均池化法即对目标矩阵中过滤器范围内的元素计算平均值,然后仅输出平均值,对其他元素进行舍弃。
在这里插入图片描述

   一般而言,最大池化法较其他方法更为常用。最大池化法意味着检测目标矩阵中的某一个特征,并且将这个特征留在池化层的输出中。

5.4.4 全连接层

   在输入原始图像经过多层卷积层及池化层加工处理之后,最后一般会由若干个全连接层给出最后的结果。在经过几轮的卷积层和池化层的处理之后,可以认为图像中所包含的信息已被抽象成为信息含量较高的特征。可以将卷积层和池化层看成自动的图像特征提取过程。在图像特征提取完成之后,依旧需要使用全连接层完成分类任务。

5.5 卷积神经网络训练

5.5.1 池化层到卷积层的反向传播

在这里插入图片描述

  对于下采样,在使用卷积神经网络的反向传播中,首先需要还原矩阵池化前的大小,如果使用的是最大池化法,则此处将δl中的值放在对应子矩阵最大值的位置;如果使用的是平均池化法,则此处将δl中的值除以子矩阵的像素个数得到平均值后放在子矩阵中。过程如下图:
在这里插入图片描述

   在面部肤色分类模型中,使用的是最大池化法,故而此处反向传播使用第一种。

5.5.2 卷积层到池化层的反向传播

   假设在卷积层l中,有且仅有一个卷积核,且其误差灵敏度为δ^l,卷积层前一层为池化层l-1。
用zl表示第l层的输入,用a(l-1)表示第l-1层的输出,故而有:
在这里插入图片描述

   其中w^l表示l层的卷积核。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6 参数调整及模型误差

   对模型使用样本数据进行训练及测试,通过修改各项参数,降低训练误差,从而提高模型判断的准确度。

6.1 使用预设参数对模型进行训练

   预设参数见下表:

在这里插入图片描述

   训练时长2268.4秒,训练误差降到 0.53
   测试图像1000张,错误判断图像887张,误差达到0.89,误差巨大。

6.2 调整参数修正模型

   由于使用预设参数训练花费时间较长,且所获得模型分类准确率低。所消耗时间过长的原因是由于样本图像尺寸过高,为尽可能的提取样本特征,导致卷积核尺寸较大,进而使计算机计算数据量庞大所造成的,故而对样本图像大小及卷积核尺寸进行调整。模型分类准确率与训练样本数据集的规模、训练次数有关,同时与模型单次输入图像数目、卷积核尺寸与图像尺寸比有关。对上述相关参数进行调整:

6.2.1 第一次修正

   由于使用大小150×150图像训练数据庞大,耗时长,故而对图像进行缩放,调整格式为28×28,调整其他参数见下表:

在这里插入图片描述

   三次训练时长分别为39.1秒、39.3秒以及39.2秒,总用时117.6秒,训练误差降到 0.08,误差较小。
   测试图像3000张,错误判断602张,误差0.2,误差较小。

6.2.2 第二次修正

   第一次修正模型误差依然较高,故而继续调整,调整参数见下表:

在这里插入图片描述

   训练时长为114.8秒,训练误差降到 0.04,误差极小。
   测试图像3000张,错误判断282张,误差0.094,误差极小。故而使用第二次修正模型。

7 人脸彩色化实例及对比

   为验证模型的适用性,本节选取样本外黄种人图像1与黑种人图像2,对两幅图像的人脸区域进行着色,然后与原图及卷积神经网络结果对比。
在这里插入图片描述

7.1 新模型图像着色

   将两幅图像的灰度图分别输入模型中,获取输出概率见下表:

在这里插入图片描述
在这里插入图片描述

   可以看出,对于图像1,最终类别为1的概率高达88.5%,故而使用类别1对应的a、b层对应值即a=10、b=10进行面部着色。
   对于图像2,最终类别为23的概率高达96.0%,故而使用类别23对应的a、b层对应值即a=19、b=22进行面部着色。
   然后将灰度图像在第三维度复制扩展三层,即图像从150×150扩展为150×150×3,然后将图像从RGB色彩空间映射到Lab色彩空间,对于面部Lab色彩的a层与b层,使用分类指标对应a、b值进行替换,结果如下:
在这里插入图片描述

   可以看出,本模型能够正确区分不同人种面部纹理特征,进而匹配不同肤色用以面部着色。

7.2 模型对比

   将图像1与图像2使用卷积神经网络模型上色,将着色结果与原图及新模型着色结果进行比较:
在这里插入图片描述

   可以看出,卷积神经网络模型对于图像1的着色效果优于第二次修正模型对图像1的着色效果,但在使用图像2进行测试时,卷积神经网络错误着色,将黑色人种误判为黄色人种,而第二次修正模型则较卷积神经网络模型着色结果较优。

8 总结

   本文使用100例人脸面部图像样本,对面部区域的Lab图像a层与b层进行统计分类,将人脸面部色彩细分为36类,构造面部色彩标识卡,然后使用卷积神经网络法制作分类模型,提取识别不同类别图像的面部纹理特征,使之能够对于任意一张人脸图片,判断其所属类别,进而获得该类别下的a、b层对应值,以完成面部着色的目的。
   在模型训练过程中,受制于硬件条件,所选训练样本较少,且各类别样本图片数目分布不均,故而着色效果与原图像相比,仍存在一定差异。在后续工作中,将进一步扩大样本容量,提取更为精确的分类特征,从而降低训练误差,提高着色质量。

参考文献

[1]李志永. 黑白影像的彩色化研究[D].中国科学院研究生院(电子学研究所),2007.
[2]朱黎博. 基于图像分割与色彩扩展的色彩传递算法研究[D].东华大学,2009.
[3]吕维帅. 基于深度神经网络的黑白图像着色算法研究[D].江西理工大学,2019.
[4]陶霖密,彭振云,徐光祐.人体的肤色特征[J].软件学报,2001(07):1032-1041.
[5]秦小文,温志芳,乔维维.基于OpenCV的图像处理[J].电子测试,2011(07):39-41.
[6]安子建. 基于Scrapy框架的网络爬虫实现与数据抓取分析[D].吉林大学,2017.
[7]黎松,平西建,丁益洪.开放源代码的计算机视觉类库OpenCv的应用[J].计算机应用与软件,2005(08):134-136.
[8]秦小文,温志芳,乔维维.基于OpenCV的图像处理[J].电子测试,2011(07):39-41.
[9]石美红,申亮,龙世忠,胡西民.从RGB到HSV色彩空间转换公式的修正[J].纺织高校基础科学学报,2008(03):351-356.
[10]王可,陆长德,乐万德,王小平.基于Lab均匀色彩空间的色彩调和系统[J].西北工业大学学报,2004(06):695-699.
[11]周飞燕,金林鹏,董军.卷积神经网络研究综述[J].计算机学报,2017,40(06):1229-1251.
[12]Bongkyu Lee, Yookun Cho, Seongwon Cho. New invariant pattern recognition system based on preprocessing and reduced second-order neural network[P]. Neural Networks, 1995. Proceedings., IEEE International Conference on,1995.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

灰度图像的彩色复原方法 ——以人脸着色为例 的相关文章

  • OpenCV 在使用 anaconda 的 Linux 上无法与 python 正常工作。收到 cv2.imshow() 未实现的错误

    这就是我得到的确切错误 我的操作系统是 Ubuntu 16 10 OpenCV 错误 未指定错误 该功能未实现 使用 Windows GTK 2 x 或 Carbon 支持重新构建库 如果您使用的是 Ubuntu 或 Debian 请安装
  • 将嘈杂的硬币重塑为圆形

    我正在使用 JavaCV OpenCV 包装器 进行硬币检测 但是当硬币连接时我遇到了一些问题 如果我尝试侵蚀它们以分离这些硬币 它们就会失去圆形形状 如果我尝试计算每个硬币内部的像素 可能会出现问题 因此某些硬币可能会被误算为更大的硬币
  • Python 函数前的星号[重复]

    这个问题在这里已经有答案了 我正在关注这个教程 http www pyimagesearch com 2015 04 20 sorting contours using python and opencv comment 405768 ht
  • cv2.imread:检查图像是否正在被读取

    我正在用 python 编写一个 OpenCV 程序 在某些时候我有类似的东西 import cv2 import numpy as np img cv2 imread myImage jpg do stuff with image her
  • 在 iPad 上使用 OpenCV 避免碰撞

    我正在开展一个项目 需要使用 OpenCV 实现碰撞避免 这是在 iOS 上完成的 iOS 5 及以上版本即可 项目目标 这个想法是将 iPad 安装在汽车仪表板上并启动应用程序 应用程序应该从相机中抓取帧并进行处理 以检测汽车是否会与任何
  • 在opencv中保存帧而不压缩

    我正在尝试使用写 OpenCV 函数 我想保存帧 TIFF扩大 我遇到的问题是保存的图像被压缩 所以我无法使用它们 知道如何摆脱这种压缩吗 提前致谢 不要介意西奇说的话 TIFF 标志通过 LZW 压缩硬编码在 opencv 二进制文件中
  • opencv 视频上的颜色阈值

    I am thresholding for a color range in an opencv video The goal is to seperate the B mode black and white information on
  • 如何解决 Python 'Pyzbar' 库的导入错误?

    我刚刚开始熟悉 Pyzbar 库 但是当使用decode方法我得到一个错误 这是代码 import cv2 import numpy as np import pyzbar code image cv2 imread C Users Ace
  • 在 Python 3.5 64 位上通过 pip 安装 OpenCV

    我尝试安装 OpenCV 但找不到任何合适的 pip 软件包 我决定上网查找有关如何安装它的官方文档 并发现this https opencv python tutroals readthedocs io en latest py tuto
  • bitblt 在 Windows 10 版本 1703 上失败 (15063.138)

    使用 Visual Studio 2017 vc141 以下代码应该从前游戏窗口获取屏幕截图 但现在它返回黑色和空白图像 唯一的游戏问题 尝试过 OpenGL 和 Vulkan ogl 返回黑色 vulkan 返回白色 在升级到 Windo
  • opencv中矩阵的超快中值(与matlab一样快)

    我正在 openCV 中编写一些代码 想要找到一个非常大的矩阵数组 单通道灰度 浮点数 的中值 我尝试了几种方法 例如对数组进行排序 使用 std sort 和选择中间条目 但与 matlab 中的中值函数相比 它非常慢 准确地说 在 ma
  • 使用 opencv warpPerspective() 生成道路的自上而下视图

    我正在尝试实施逆透视映射计算与道路上另一辆车的距离 我知道在应用该函数之前我需要生成一个包含源点和目标点的变换矩阵warpPerspective 但我不知道如何计算目的地点 我在这个论坛和其他网站中搜索 但无法将第一张图片转换为第二张图片
  • 如何在opencv python中为图像添加边框

    如果我有如下图所示的图像 如何在图像周围添加边框 以便最终图像的整体高度和宽度增加 但原始图像的高度和宽度保持在中间 下面的代码添加了一个大小恒定的边框10像素到原始图像的所有四个边 对于颜色 我假设您想要使用背景的平均灰度值 这是我根据图
  • 如何删除树莓派的相机预览

    我在我的 raspberryPi 上安装了 SimpleCv 并安装了用于使用相机板的驱动程序 uv4l 驱动程序 现在我想使用它 当我在 simpleCV shell Camera 0 getImage save foo jpg 上键入时
  • OpenCV的拼接模块可以拼接平行运动相机拍摄的图像吗?

    我想知道是否缝合 http docs opencv org modules stitching doc stitching html http docs opencv org modules stitching doc stitching
  • Python中最相似的人脸识别

    如何使用Python和OpenCV来查找面部相似 我已成功使用 OpenCV 和 Python 使用 Haar Cascades 从多张照片中提取人脸 我现在有一个图像目录 所有这些都是不同人的面孔 我想做的是拍摄一张样本图像 然后看看它最
  • 曲线/路径骨架二值图像处理

    我正在尝试开发一个可以处理图像骨架的路径 曲线的代码 我想要一个来自两点之间骨架的点向量 该代码在添加一些点后结束 我没有找到解决方案 include opencv2 highgui highgui hpp include opencv2
  • OpenCV 仅围绕大轮廓绘制矩形?

    第一次发帖 希望我以正确的方式放置代码 我正在尝试检测和计算视频中的车辆 因此 如果您查看下面的代码 我会在阈值处理和膨胀后找到图像的轮廓 然后我使用 drawContours 和矩形在检测到的轮廓周围绘制一个框 我试图在 drawCont
  • 来自连接到远程机器的相机的 Opencv 流

    我正在用 python 开发一个 wx 应用程序 用于流式传输和显示来自两个不同网络摄像头的视频 这工作正常 但现在我需要在不同的场景中执行此操作 其中两个摄像头连接在通过网络连接的 Windows 上运行的单独计算机中 我的应用程序将在机
  • 如何去除给定图像中的噪声,使 ocr 输出完美?

    我已经对这个孟加拉文本图像进行了大津阈值处理 并使用 tesseract 进行 OCR 但输出非常糟糕 我应该应用什么预处理来消除噪音 我也想校正图像 因为它有轻微的倾斜 我的代码如下 import tesserocr from PIL i

随机推荐

  • SpringBoot项目拦截器过滤器配置

    1 我们在配置拦截器时需实现接口HandlerInterceptor package com example springbootdemo common conf interceptor import com example springb
  • QT窗体间传值总结

    在写程序时 难免会碰到多窗体之间进行传值的问题 依照自己的理解 我把多窗体传值的可以使用的方法归纳如下 1 使用QT中的Signal Slot机制进行传值 2 使用全局变量 3 使用public形式的函数接口 4 使用QT中的Event机制
  • pytesseract和PIL库用法是什么?【详细教程】

    Tesseraet是一个命令行工具 安装后只能通过tsseraet命令在Python的外部运行 而不能通过import语句引人使用 为了解决上述问题 Python 提供了支持Tssraec OCR引擎的Python版本的库pytessera
  • 04. 《Lombok 实战 —— @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor》

    文章目录 Lombok 实战 NoArgsConstructor RequiredArgsConstructor AllArgsConstructor 1 NoArgsConstructor 1 1 NoArgsConstructor 实战
  • 夯实C++基础之刷题:链表——3合并两个有序列表

    题目 解题 递归和迭代 我的理解 递归是自己调用自己 迭代是按思路往下走 1 递归 class Solution public ListNode mergeTwoLists ListNode list1 ListNode list2 递归
  • 敏捷开发概述

    一 历史背景 20世纪60年代 软件规模小 已作坊式开发为主 20世纪70年代 硬件快速发展 软件规模和复杂度不同以往 引发软件危机 20世纪80年代 引入瀑布模型 以过程为中心分阶段控制软件开发 20世纪90年代 软件开发过程日益变重 开
  • mysql清缓存、查看连接数及链接时间

    mysql清缓存 查看连接数及链接时间 flush privileges 刷新缓存 SHOW FULL processlist 查看连接数据库的进程id ip 用户名 连接的数据库 连接状态 连接时长等 show variables lik
  • Node.js程序如何建立及使用Model

    建立Model 直接使用Sequelize虽然可以 但是存在一些问题 团队开发时 有人喜欢自己加timestamp var Pet sequelize define pet id type Sequelize STRING 50 prima
  • Unity中loading页加载的实现

    首先创建一个Global cs 使用单例用于存储场景的名字 便于后续脚本的调用 此脚本不必挂载在游戏物体上 using UnityEngine using System Collections public class Global Mon
  • Eclipse项目上有红色的叉或感叹号

    Eclipse中导入的项目没有报错 甚至都能正常运行 但就是会有一个红色的 或 对于一个有强迫症的我 忍不了 下面怎么解决 我提供一个平时解决的方法 首先 这个报错是IDE工具的报错 先找到报错描述 window gt show view
  • Go语言学习路线

    gogogo git 地址 Go 学习 学习路线 2 基础知识 3 开发工具安装地址 下载 Go基础知识 链接为gitee地址 放心查看 基础结构 learn1 go 基础语法 learn2 go 数据类型 learn3 go 变量 lea
  • mkfs.xfs: cannot open /dev/sdb1: Device or resource busy 设备或资源忙

    今天在centos下用xfs格式化磁盘出现如下错误 mkfs xfs cannot open dev sdb1 Device or resource busy 设备或资源忙 时出现 重启服务器后再格式化也一样 也就是重启服务器没什么用 用l
  • QT之一个UI里边多界面切换

    QT之多界面交换 环境 VS2019 QT tools 从网上查看了许多大神的帖子 先将多界面切换的方法总结如下 1 可以通过QT Designer中添加Containers控件里的Stacked Widget实现同一个UI里的页面切换 可
  • multisim仿真 74LS147D芯片

    multisim仿真 74LS147D芯片
  • el-input-number默认值为空怎么设置

    el input number 没有值的情况下 默认值为0 一般没有值的情况下默认值为空 需要将默认值 undefined
  • 【PDF】PDF无法注释的一种解决方案

    PDF无法注释 需要检查 1 权限问题 2 文档规范问题 PDF A 拓展阅读 浏览器打开PDF调整亮度和颜色的小技巧 处理pdf 文档的相关功能包总结 1 pdf文档不能注释 下载的一篇pdf文档在阅读时不能注释 高亮和打字机等选项都是灰
  • java通过MultipartFile进行文件、图片上传和下载,以及文件流

    java通过MultipartFile进行文件 图片上传和下载 以及文件流 package com fh controller import com fh util UuidUtil import org apache commons io
  • 机组logisim P0课下

    首先是记录猪脚强调的注意事项 输入信号一般是通过MUX 多路选择器来实现对输出结果的控制 刚连接好电路时或者连接电路中 可能有一些电路莫名其妙是蓝色 这时关闭logisim后再次打开就好了 Comparator器件默认是有符号的 要调成un
  • git commit提交之后,push 失败

    情况 在git commit m 备注 之后 git push 出现错误 出现的错误是 我提交的代码格式不满足要求 原因是 因为在一些公司里面 有提交代码的一个格式 就比如 m后面的备注信息 是要求有一定格式的 但是我第一遍的格式是写错了
  • 灰度图像的彩色复原方法 ——以人脸着色为例

    灰度图像的彩色复原方法 以人脸着色为例 代码文件下载地址 摘要 灰度图像彩色复原在图像修复领域有广泛的应用 由于其涉及从低纬度空间向高纬度空间的映射 故而修复效果存在差异 本文以人脸为例研究灰度图像的彩色复原方法 在主流灰度图像彩色修复算法