人脸红图提取(基于opencv提取人脸热图)
一、红色图获得原理
观察例图我们可以发现,红色图本质上是提取了原图的红色部分,即温度较高的部分,猜测图2应该是由原始图片经过红外温度扫描成像的,因此要从图1转变为图2应该首先提取红色部分,如何再进行图像增强,提升对比度等操作。
1.1红色部分提取
由于脸颊、粉刺和嘴唇的红色略有不同,为了使得提取更加精确我采用了分段式提取。
并确定了最终的色彩范围
H | S | V | |
mask1 | 10-14 | 0-255 | 188-196 |
mask2 | 8-10 | 0-255 | 0-255 |
mask3 | 1-8 | 0-255 | 0-255 |
之所以选择在HSV色域中进行红色部分的提取,是因为RGB通道并不能很好地反映出物体具体的颜色信息,而相对于RGB空间,HSV空间能够非常直观的表达色彩的明暗,色调,以及鲜艳程度,方便进行颜色之间的对比。(附上HSV色域空间图如下所示)
1.2颜色关系映射
1.2.1 映射关系试算一
在提取红色部分后,我们得到了三个掩膜mask1、mask2、mask3,但仅据此还无法将t1.png转换为t2.png,他们之间存在一个颜色关系映射,但这个映射关系我们无法准确获得,仅能通过概率统计的方式获取一个近似值。分别打印出原始图片t1三个通道的值origin_H、origin_S、origin_V、和红色例图t2的HSV值red_H,red_S,red_V。
我们期望获得从origin(H,S.V)到red(H,S,V)之间的颜色关系映射,这个映射并不直观,但是通过观察我们不难发现t2的H值基本在176附近,因此可近似任务红色图中的H值为定值,而观察red_S我们发现它个origin_H的变化相似只不过符号相反,因此可以尝试用origin_H线性映射到red_S。又发现red_V和red_S之间也有类似的关系,取red_S=red_V,当然不能直接取值,还需要根据值域对公式进行调整,上式只是简单的说明了他们之间的关系,下面是通过上述映射关系得到的成像,可以看到图像失真很严重,这是因为我们仅仅利用了origin_H这一个原始特征进行拟合,信息丢失严重!
1.2.2 映射关系试算二
再次观察数据分布我们发现origin_S的变化也影响着red_S,因此我们可以合理对origin_H和origin_S做线性组合来近似拟合red_S的变化。
经过权重调整,我们最终选定了用这一映射关系来近似拟合red_H。
同样的,对red_V进行拟合得到
于是根据这个映射关系,我们可以将原图映射到红图,得到如下结果,相比来说,精度已经提升了很多但是对于一些细节未能得到凸显,处理的效果仍然不好。
1.2.3 映射关系试算三
观察映射关系二中拟合的结果,我们不难发现有很多散点特别分散,根本无法用线性函数进行拟合,而且不同补位,如图像从脸部到嘴唇,色彩鲜艳度应该是剧烈上升,亮度极具下降,而脸部不同皮肤之间的过渡应该缓慢改变S、V值,因此我们考虑用分段函数进行拟合,正如我们对原图进行mask的时候一样,这里我们在原始拟合函数的基础上,根据自变量的不同进行函数参数的调整(这一步很麻烦,需要不停的根据效果图,结合S表示饱和度即鲜艳程度、V表示亮度,反复修改拟合函数的参数),以达到良好的分段效果。
使用调整后的映射关系可得到如下图像,已经能明显识别各个红区了,但图像对比度仍然有所不足。
最后使用图像增强技术,利用gamma变换增加图像的对比度,Gamma变换的本质就是用来图像增强,其提升了暗部细节,简单来说就是通过非线性变换,让图像从暴光强度的线性响应变得更接近人眼感受的响应,即将漂白(相机曝光)或过暗(曝光不足)的图片,进行矫正,得到HSV色域下处理的最终图像。
经过Gamma变换后的输入和输出图像灰度值关系如图所示:横坐标是输入灰度值,纵坐标是输出灰度值,蓝色曲线是gamma值小于1时的输入输出关系,红色曲线是gamma值大于1时的输入输出关系。可以观察到,当gamma值小于1时(蓝色曲线),图像的整体亮度值得到提升,同时低灰度处的对比度得到增加,更利于分辩低灰度值时的图像细节。
1.3 转HSV色域下处理的最终结果
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!