探索发现:记一次深度图像处理的经历

一、 前言

2021年底,领导给了个tof模块,要求基于此开发一个演示程序,实现3D人脸识别的功能。当时听他说出3D人脸识别就有点头疼,第一是想自己之前没接触这样的项目;第二是在想3D人脸数据相比于2D人脸数据,恐怕没后者那么多。基于快速开发出产品以及自身能力的想法,向领导建议使用2D+技术路线,即采用rgb图做人脸识别,采用深度图做真假脸识别,领导同意了。

rgb图用到的就是些网上开源、成熟的模型,如retinafacemobileface,这部分不是今天的主题,也没什么好说的,网上博客大把。主要说说深度图吧,简单把过程记录一下,方便自己且抛砖引玉,如果有错漏之处,还请指出,谢谢!

二、 过程

(一)图片预处理过程

先给大伙看看tof保存的深度图,16 bit png格式,每个像素值的实际物理意义是距离,单位是mm
在这里插入图片描述
我没有上传错,原图就是这样,看起来乌漆嘛黑的。因为它是16 bit,像素值范围是[0, 65536),下面给它映射到[0, 256),再给它像素反转一下。

import cv2
import numpy as np

def u16_to_u8(depth_image):
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(depth_image)
    
    alpha = 255 / (max_val - min_val)
    
    beta = -min_val
   
    result = ((depth_image + beta) * alpha).astype(np.uint8)
    
    return result

depth_image = cv2.imread(r"test.png", cv2.IMREAD_ANYDEPTH)
depth_image = u16_to_u8(depth_image)
depth_image = 255 - depth_image
cv2.imshow('depth_image', depth_image)
key = cv2.waitKey(0)

显示结果如下
在这里插入图片描述
可以看见也没什么卵区别,都是一片糊。如果要根据深度图来做分类,区分真假脸,这样的数据恐怕不好做,所以需要再做进一步处理,比如直方图均衡。先试试opencv自带的直方图均衡函数。

depth_image = cv2.imread(r"test.png", cv2.IMREAD_ANYDEPTH)
depth_image = u16_to_u8(depth_image)
cv_he = cv2.equalizeHist(depth_image)
cv2.imwrite(r"t1.png", cv_he)

在这里插入图片描述
看起来效果好了点,但还是有点不够。下面试试openni的直方图均衡函数。

def get_his_img(img, his_size = 65536):
    if len(img.shape) == 2:
        img = img[np.newaxis, :]
    _, h, w = img.shape
    hist = cv2.calcHist(img, [0], None, [his_size - 1], [
  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值