OpenCV 从浮点型数据的视差图中分割并滤除小的斑块

本文介绍了如何利用OpenCV的filterSpeckles函数来滤除浮点型视差图中的小斑块。虽然官方接口仅支持CV_8UC和CV_16SC类型,但通过深入源码,发现其实现并未限制数据类型。作者提供了适用于更多数据类型的自定义接口实现,以避免不必要的数据转换步骤。
摘要由CSDN通过智能技术生成

OpenCV 在BM匹配方法中提供了一个非常有用的函数:filterSpeckles(),用于从视差图中直接去除一些小的(甚至粘连在一起的)斑块。但也许这个函数在设计之初只是为了在BM算法中使用,所以遗憾的是这个函数的接口在设计上只能接收CV_8UC和CV_16SC两种数据类型的视差图像,这一点在OpenCV的手册中已经明确了。

而在很多基于立体视觉原理的高精度测量中,我们所使用的视差图都是CV_32F类型的数据,倘若每次为了滤除斑块而重新做遍历一次图像转换数据,多少有点让人觉得多此一举却又无能为力。

所以笔者找到这个接口方法的内部实现,欣喜的发现在底层实现中其实并未限制数据的类型,因此,兴致来了,就把底层的代码搬了出来,重新自己定义了一个接口,使这个方法可以适用于更多数据类型的视差图,因此为实现代码,仅供参考。

typedef cv::Point_<short> Point2s;

template <typename T>
void FilterSpeckles(Mat& img, int maxSpeckleSize, float maxDiff)
{
	using namespace cv;

	int newVal = img.cols;

	cv::Mat _buf;

	int width = img.cols, height = img.rows, npixels = width*height;
	size_t bufSize = npixels*(int)(sizeof(Point2s) + sizeof(int) + sizeof(uchar));
	if (!_buf.isContinuous() || !_buf.data || _buf.cols*_buf.rows*_buf.elemSize
OpenCV Contrib 视差图滤波模块是用于处理立体视觉产生的视差图的工具。视差图是通过计算两个已经校正的图像之间的差异来获得的,并且它包含了各个像素点之间的视差值。 视差图滤波的目的是对视差图存在的不一致或噪声进行消除,并提高图像的质量和准确性。在三维重建和深度估计等任务,滤波能够显著改善图像的效果和结果。 视差图滤波算法基于局部窗口的像素值来计算每个像素点的视差值。常见的滤波方法包括值滤波、高斯滤波和双边滤波等。在滤波过程,局部窗口内的像素值会被统计和处理,以获得更准确的视差值。 值滤波是一种常用的视差图滤波方法,它通过计算窗口内像素值的值来代替视差图的每个像素点的值。这种方法对于消除离群值和噪声具有较好的效果,能够生成更准确的视差图结果。 高斯滤波是一种基于高斯函数的滤波方法,它通过对窗口内的像素值进行加权平均来获得视差值。这种方法能够在保持图像细节的同时,对噪声进行平滑处理,提高视差图的质量。 双边滤波是一种结合了空间距离和灰度差异的滤波方法。它通过考虑像素之间的空间位置和灰度相似性来进行滤波,能够更好地保持图像边缘信息和纹理细节。 综上所述,视差图滤波是一种用于处理立体视觉视差图的方法,能够提高图像的质量和准确性。值滤波、高斯滤波和双边滤波是常用的视差图滤波算法,它们各自具有不同的优点和适应场景。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值