视觉深度图后处理中空洞填充问题

本文介绍了一种针对双目SGBM匹配后深度图中空洞问题的解决方案。作者编写了一个脚本,通过查找空洞周围像素的最大值来填补空洞。实验对比了使用前后50个像素和相邻1个像素的最大值进行填补的效果,发现参数选择应根据图像分辨率调整,以达到最佳的平滑效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在双目SGBM匹配之后,由于遮挡和误匹配等问题,最后出来的深度图会存在很多噪点和空洞,这些问题无法通过某一种滤波方法解决,对于这个问题我尝试自己写了一个脚本,能比较好的去除空洞。代码如下:
头文件hole_filling.h

#pragma once
#include<iostream>
#include <opencv2/opencv.hpp>
#include<typeinfo>
#include<algorithm>
#include<vector>
#include<numeric>
using namespace std;

void insertDepth32f(cv::Mat& depth);

源文件hole_filling.cpp

#include"hole_filling.h"

void insertDepth32f(cv::Mat& depth)
{
	
	for (int i = 0; i < depth.rows; i++)
	{
		for (int j = 0; j < depth.cols; j++)
		{
			if (depth.channels() == 1)
			{
				//图像数组是逐行逐列顺序排列的,也就是第一行,全列,第二行全列的走
				int a,b,indexs = i * depth.cols + j;
				//cout << typeid(depth.data[indexs]).name() << endl;
				a = (int)depth.data[indexs];
				//cout << a << endl;
				if (a == 0 && j > 50 && j< depth.cols-50 && i>50 && i< depth.rows-50)
				{
					
					//vector<int> testarray = { (int)depth.data[indexs - 50], (int)depth.data[indexs + 50], (int)depth.data[indexs - 50 * depth.cols], (int)depth.data[indexs + 50 * depth.cols] };
					b = max({ (int)depth.data[indexs - 50], (int)depth.data[indexs + 50], (int)depth.data[indexs - 50* depth.cols], (int)depth.data[indexs + 50 * depth.cols] });//accumulate(testarray.begin(),testarray.end(),0)/4;
					//cout << "a的值为:"<<a<<"b的值为:"<<b << endl;
					 depth.data[indexs] = b;
				}
			}
			else if (depth.channels() == 3)
			{
			}
		}
	}

}

我做了两个实验,b = max({ (int)depth.data[indexs - 50], (int)depth.data[indexs + 50], (int)depth.data[indexs - 50* depth.cols], (int)depth.data[indexs + 50 * depth.cols]

  1. 一个是把距离当前空洞像素前后上下50个像素处的最大像素值替代当前空洞像素;
  2. 另一个是把距离当前空洞像素前后上下1个像素处的最大像素值替代当前空洞像素;
    得出来的效果如下:
     原图参数为1参数为50
    可以看到参数设置为50的时候填充缺乏渐变,存在新的噪点,具体选择参数为多少应根据需要处理的图片的分辨率来确定,大分辨率参数可以适当设置的大一些。
### 处理深度图中超距造成空洞的方法 对于超距造成的空洞问题,在计算机视觉领域内存在多种方法来应对这一挑战。一种常见的策略是利用插值技术填充这些区域,通过分析周围像素的深度信息来进行合理的估计[^1]。 另一种有效的方式涉及采用多视角融合算法。这种方法收集来自不同角度拍摄到的画面并综合考虑各个方向上的数据,从而更精确地重建场景中的物体表面结构,减少因单目摄像头局限性而产生的误判情况[^2]。 此外,基于学习的方法近年来也取得了显著进展。卷积神经网络(CNNs)可以被训练用来预测缺失部分的深度值,这类模型能够捕捉图像的空间特征以及上下文关系,进而实现高质量的修复效果[^3]。 ```python import numpy as np from scipy.interpolate import griddata def fill_holes(depth_map, method='linear'): """ 使用插值法填补深度图中的空洞 参数: depth_map (numpy.ndarray): 输入含有空洞深度图 method (str): 插值方式,默认线性插值 返回: filled_depth_map (numpy.ndarray): 经过处理后的无孔洞深度图 """ valid_points = ~np.isnan(depth_map) coords_valid = np.argwhere(valid_points).astype(np.float32) values = depth_map[valid_points] rows, cols = depth_map.shape[:2] all_coords = np.stack(np.meshgrid(range(rows), range(cols)), axis=-1).reshape(-1, 2) interpolated_values = griddata(coords_valid, values, all_coords, method=method, fill_value=np.nan) reshaped_interpolated = interpolated_values.reshape((rows, cols)) mask = np.isnan(reshaped_interpolated) reshaped_interpolated[mask] = np.nanmean(values) return reshaped_interpolated.T # 示例调用 depth_image_with_holes = ... # 假设这里有一个带有nan值表示未知区域的二维数组作为输入 filled_depth_image = fill_holes(depth_image_with_holes) ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值