深度数据失效点处理

有关深度相机D435获取深度数据的操作在上一篇博客中提及,此处不再进行讲解。
针对上文中所提及的失效数据,我们处理的方法采用高斯分布(原因:深度数据中产生失效的数据只是一部分)将该失效部分的数据进行修正。

1、处理整列或整行失效的数据

深度相机在使用过程中,一般勤快下是不会测量到距离为0的数据,所以我们需要剔除整行或整列都为0的数据,此处采用均值近似求解。

# 行列数据为均值为0剔除处理
# data为获得的深度数据
def col_row_process(data):
    data_new = data
    #列数据处理
    col = 0
    d = data.shape[1]
    while col < d:
        da = data_new[:, col]  # 获取某列的值,data[0,:]获取某行的值
        if np.mean(da) == 0:
            data_new = np.delete(data_new, col, 1)
            d -= 1
        else:
            col += 1
    #行数据处理
    row = 0
    d = data_new.shape[0]
    while row < d:
        da = data_new[row, :]  # 获取某行的值
        if np.mean(da) == 0:
            data_new = np.delete(data_new, row, 0)
            d -= 1
        else:
            row += 1
    return data_new

2、0值处理

针对列或行中出现的个别深度数据为0的点,我们采用补齐法进行处理

def interp_data(depth_image,abnormal):
    fn = 0
    new_data = depth_image
    try:
        for i in range(new_data.shape[0]):
            for j in range(new_data.shape[1]):
                if new_data[i,j]==0:
                    if j==0:
                        d = j
                        while new_data[i,d]==0:
                            d +=1
                        new_data[i, j] = new_data[i, d]
                    else:
                        new_data[i, j] = new_data[i, j - 1]
                    fn += 1
		return new_data,fn             
    except Exception as e:
        print(e)

0值数据处理前
在这里插入图片描述
处理后
在这里插入图片描述

3、高斯分布失效点处理

高斯分布(Gaussian distribution)又称为正态分布(normal distribution),在统计学上具有重要的意义。
在这里插入图片描述
其概率密度函数为:
在这里插入图片描述
有关高斯分布详细的介绍大家可以参考该博主的讲解
我们此处所处理的失效点是指非零的失效点,如下所示图
在这里插入图片描述
采用高斯分布对失效点进行处理

def abnormal_process(depth_image):
    depth_data = depth_image
    up = 0
    # 行处理
    for i in range(len(depth_data)):
        row_data = depth_data[i]
        row_mean = np.mean(row_data)
        row_std = np.std(row_data)
        up_data = int(row_mean + (2.5 * row_std))
        lo_data = int(row_mean - (1.5 * row_std))
        for j in range(len(depth_data[i])):
            if depth_data[i,j]>up_data or depth_data[i,j]< lo_data:
                if j == 0:
                    d = j
                    while depth_data[i,d]>up_data:
                        d +=1
                    depth_data[i,j] = depth_data[i,d]
                else:
                    depth_data[i,j] = depth_data[i,j-1]
                up +=1
    # 列处理
    for j in range(depth_data.shape[1]):
        col_data = np.sort(depth_data[:,j])
        col_mean = np.mean(col_data)
        col_std = np.std(col_data)
        up_data = int(col_mean + (2.5* col_std))
        lo_data = int(col_mean - (1.5 * col_std))
        for i in range(len(depth_data[:,j])):
            if depth_data[i,j]>up_data or depth_data[i,j]< lo_data:
                if i == 0:
                    d = i
                    while depth_data[d,j]>up_data:
                        d +=1
                    depth_data[i,j] = depth_data[d,j]
                else:
                    depth_data[i,j] = depth_data[i-1,j]
                up += 1
    return depth_data,up

经过处理后
在这里插入图片描述
更多关于深度相机数据的使用和求解相关数据的内容也将在后期进行分享。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐